如何使文件稀疏?

时间:2011-05-13 08:38:14

标签: java linux file sparse-file

如果我有一个包含许多零的大文件,我怎样才能有效地将其作为稀疏文件?

唯一的可能是读取整个文件(包括所有可能存储稀疏的零)并使用seek跳过零区域将其重写为新文件?

或者是否有可能在现有文件中进行此操作(例如File.setSparse(long start,long end))?

我正在寻找Java或某些Linux命令的解决方案,Filesystem将是ext3或类似的。

5 个答案:

答案 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).

GNU 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年来我保留胡子稀疏的稀疏文件复制的灰胡子方式。