什么是稀疏文件,为什么需要它?

时间:2017-03-30 19:26:06

标签: file filesystems system disk sparse-file

什么是稀疏文件,我们为什么需要它? 我唯一能得到的是它是一个非常大的文件,它是高效的(千兆字节)。效率如何?

2 个答案:

答案 0 :(得分:9)

假设您有一个包含许多空字节\x00的文件。这些空字节\x00称为空洞。存储空字节效率不高,我们知道文件中有很多字节,所以为什么要将它们存储在存储设备上?我们可以改为存储描述这些零的元数据。当进程读取文件时,这些零字节块是动态生成的,而不是存储在物理存储上(从维基百科看这个原理图):

Sparse File - Wikipedia

这就是稀疏文件高效的原因,因为它不会在磁盘上存储零,而是保存足够的数据来描述将生成的零。

注意:逻辑文件大小大于稀疏文件的物理文件大小。这是因为我们没有将零物理存储在存储设备上。

修改:

当你跑步时:

$ dd if=/dev/zero of=output bs=1G count=4

此处的命令将4G空字节块复制到output。要看到:

$ stat output
File: ouput
  Size: 4294967296      Blocks: 8388616    IO Block: 4096   regular file
--omitted--

您可以看到此文件分配了 8388616 块,这些块只存储从/dev/zero复制的空字节,它们占用物理磁盘空间,它们存储在磁盘上的空洞(稀疏零)。 dd完成了您的要求,将数据块从一个文件复制到另一个文件。

现在,运行此命令以检测孔并使文件稀疏到位:

$ fallocate -d output
$ stat output
File: swapfile
  Size: 4294967296      Blocks: 0          IO Block: 4096   regular file
--omitted--
你注意到了什么吗?块的数量现在为0,因为仅存储空字节的块被解除分配。请记住,output的块不存储任何内容,只有一堆空零,fallocate -d检测到只包含空零的块并取消分配它们,因为此文件的所有块都包含零,他们都被解除了分配。

还要注意尺寸是如何保持不变的。这是文件的逻辑(虚拟)大小,而不是磁盘上的大小。了解output现在没有占用物理存储空间至关重要,它有0块分配给它,因此我并没有真正使用磁盘空间。运行fallocate -d后保留的大小因此,当您稍后从文件中读取时,您将获得文件系统在运行时为您生成的空字节。但output的物理大小为零,它不使用数据块。

请记住,当您读取output文件时,文件系统在运行时动态生成空字节,它们实际存储在磁盘上,文件&#39 ; stat报告的s大小是逻辑大小,output的物理大小为零。在这种情况下,当进程读取文件时,文件系统必须生成4G空字节。

使用dd生成稀疏文件:

$ dd if=/dev/zero of=output2 bs=1G seek=0 count=0
$ stat 
stat output2
  File: output2
  Size: 4294967296      Blocks: 0          IO Block: 4096   regular file

GNU dd内部使用lseekftruncate,因此请检查truncate(2)和lseek(2)。

答案 1 :(得分:1)

稀疏文件是一个大部分为空的文件,即它包含大块字节,其值为0(零)。

在磁盘上,文件的内容以固定大小的块(通常为4 KiB或更多)存储。当这样一个块中包含的所有字节都是0时,实现稀疏文件的文件系统不会将该块存储在磁盘上,而是将信息保存在文件元数据中的某个位置。

使用稀疏文件的优点:

  • 空数据块不占用磁盘空间;它们不是作为常规数据块存储的,它们的标识符(仅使用几个字节)存储在文件元数据中;这样就为每个空块保存了4 KiB的磁盘空间(或更多);
  • 从稀疏文件中读取空数据块不需要时间;发生这种情况是因为没有从磁盘读取数据;因为文件系统知道块中的所有字节都是0,所以它只是设置为0输入缓冲区中的所有字节,数据就绪;无需访问慢速存储设备;
  • 将空数据块写入稀疏文件不需要时间;在写入时,文件系统检测到块是空的(其所有字节都是0)并将块ID放入空块列表中(在文件元数据中);没有数据写入磁盘。

有关稀疏文件的更多信息,请参见Wikipedia page