【问题标题】:How to make file sparse?如何使文件稀疏?
【发布时间】:2011-05-13 08:38:13
【问题描述】:

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

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

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

我正在寻找 Java 或一些 Linux 命令的解决方案,文件系统将是 ext3 或类似的。

【问题讨论】:

  • 第一个解决方案是在 'cp --sparse=always' 中实现的,但效率不高,需要复制文件并在之后移动。
  • @joe:那是关于从头开始创建一个稀疏文件,但我想让现有文件变得稀疏。
  • @runouni,如果漏洞足够大,也许值得拆分文件并使用文件系统删除/删除部分。
  • 使文件稀疏会导致这些部分在被重复使用时被碎片化。我认为你最好预先分配整个文件并维护一个被占用的页面/部分的表/位集。也许节省几 TB 的磁盘空间不值得高度碎片化文件的性能损失。

标签: java linux file sparse-file


【解决方案1】:

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

tmpfs 在该列表中是我觉得最有趣的一个。文件系统本身的效率足以仅消耗存储其内容所需的 RAM,但使 内容 变得稀疏可能会进一步提高效率。

GNU cp

此外,GNU cp 在某处获得了对稀疏文件的理解。引用cp(1) man page 关于其默认模式--sparse=auto

粗略的启发式检测到稀疏的 SOURCE 文件,并且相应的 DEST 文件也变得稀疏。

但也有 --sparse=always,它激活文件复制等效于 fallocate -d 就地执行的操作:

只要 SOURCE 文件包含足够长的零字节序列,请指定 --sparse=always 创建稀疏 DEST 文件。

我终于可以让我的 tar cpSf - SOURCE | (cd DESTDIR && tar xpSf -) 单线器退休了,这 20 年来一直是我复制稀疏文件并保留其稀疏性的灰胡子方式。

【讨论】:

  • 谢谢。您对 GNU cp 的提示帮助了我。它在其他工具(例如rsync --sparse)速度较慢的情况下运行速度很快。
【解决方案2】:

Linux / UNIX 上的某些文件系统能够“打孔”到现有文件中。见:

它不是很便携,也不是完全一样;截至目前,我相信 Java 的 IO 库没有为此提供接口。

如果可以通过fcntl(F_FREESP) 或任何其他机制进行打孔,则它应该比复制/查找循环快得多。

【讨论】:

  • 您知道是否有工具将其应用于文件,因为我不是经验丰富的 C 黑客。
  • 在 Linux 中,使用 fallocate 中的 FALLOC_FL_PUNCH_HOLE 标志。
【解决方案3】:

我认为您最好预先分配整个文件并维护被占用的页面/部分的表/BitSet。

使文件稀疏会导致这些部分在被重复使用时被碎片化。也许节省几 TB 的磁盘空间不值得高度碎片化文件的性能损失。

【讨论】:

    【解决方案4】:

    根据article,目前似乎没有简单的解决方案,除了使用 FIEMAP ioctl。但是,我不知道如何将“非稀疏”零块变成“稀疏”块。

    【讨论】:

      【解决方案5】:

      您可以在 linux 终端上使用$ truncate -s filename filesize 来创建具有

      的稀疏文件

      只有元数据。

      注意——文件大小以字节为单位。

      【讨论】:

      • 这里有两个问题:(1)你的论点是倒退的,应该是truncate -s size filename。 (size 实际上可以是任何指定的单位,例如10K = 10240 字节,2MB = 2000000 字节)。 (2) 该问题询问关于使 existing 文件稀疏的问题,而这只会创建一个新的稀疏文件(或扩展现有文件并在末尾具有稀疏区域)。
      猜你喜欢
      • 2014-08-12
      • 2014-10-03
      • 2023-03-08
      • 2017-08-31
      • 2011-03-13
      • 2010-12-31
      • 2011-04-30
      • 1970-01-01
      • 2014-10-12
      相关资源
      最近更新 更多