如果我有一个包含许多零的大文件,我怎样才能有效地将其作为稀疏文件?
唯一的可能是读取整个文件(包括所有可能存储稀疏的零)并使用seek跳过零区域将其重写为新文件?
或者是否有可能在现有文件中进行此操作(例如File.setSparse(long start,long end))?
我正在寻找Java或某些Linux命令的解决方案,Filesystem将是ext3或类似的。
答案 0 :(得分:3)
Linux / UNIX上的某些文件系统能够“打孔”到现有文件中。参见:
它不是非常便携,并没有全面完成相同的方式;截至目前,我认为Java的IO库没有为此提供接口。
如果可以通过fcntl(F_FREESP)
或通过任何其他机制进行打孔,它应该比复制/搜索循环快得多。
答案 1 :(得分:2)
我认为你最好预先分配整个文件并维护被占用的页面/部分的表/ BitSet。
使文件稀疏会导致这些部分在重新使用时被分段。也许节省几TB的磁盘空间不值得高度分散的文件的性能损失。
答案 2 :(得分:0)
根据这个article,除了使用FIEMAP ioctl之外,目前似乎没有简单的解决方案。但是,我不知道如何将“非稀疏”零块变成“稀疏”块。
答案 3 :(得分:0)
您可以在linux终端上使用$ truncate -s filename filesize
创建具有
仅限元数据。
注意 - 文件大小以字节为单位。
答案 4 :(得分:0)
8年内发生了很多变化。
fallocate -d
filename
可用于在现有文件中打孔。来自fallocate(1)
man page:
-d, --dig-holes
Detect and dig holes. This makes the file sparse in-place,
without using extra disk space. The minimum size of the hole
depends on filesystem I/O block size (usually 4096 bytes).
Also, when using this option, --keep-size is implied. If no
range is specified by --offset and --length, then the entire
file is analyzed for holes.
You can think of this option as doing a "cp --sparse" and then
renaming the destination file to the original, without the
need for extra disk space.
See --punch-hole for a list of supported filesystems.
(该列表:)
Supported for XFS (since Linux 2.6.38), ext4 (since Linux
3.0), Btrfs (since Linux 3.7) and tmpfs (since Linux 3.5).
cp
此外,在GNU cp
的某个过程中,已经了解了稀疏文件。引用cp(1)
man page的默认模式--sparse=auto
:
稀疏试探法检测到稀疏的SOURCE文件,并且相应的DEST文件也变得稀疏。
但是还有--sparse=always
,它可以激活与fallocate -d
就地执行的文件复制等效的操作:
指定
--sparse=always
以便在SOURCE文件包含足够长的零字节序列时创建一个稀疏的DEST文件。
我终于能够退役我的tar cpSf - SOURCE | (cd DESTDIR && tar xpSf -)
一线客,这是20年来我保留胡子稀疏的稀疏文件复制的灰胡子方式。