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

Luv33preet

什么是稀疏文件,为什么我们需要它?我唯一能得到的是它是一个非常大的文件,并且效率很高(以GB为单位)。效率如何?

敌百虫

假设您有一个包含许多空字节的文件\x00这些许多空字节\x00称为空洞。存储空字节只是效率不高,我们知道文件中有许多空字节,那么为什么将它们存储在存储设备上呢?相反,我们可以存储描述这些零的元数据。当进程读取文件时,动态生成零字节块,而不是将其存储在物理存储中(请参阅来自维基百科的此示意图):

稀疏文件-维基百科

这就是稀疏文件之所以有效的原因,因为它不将零存储在磁盘上,而是保留了足够的数据来描述将要生成的零。

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


编辑:

运行时:

$ 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文件时,空字节是由文件系统在运行时动态生成的,它们并不是真正地物理存储在磁盘上,并且报告的文件大小stat是逻辑大小,而的物理大小为0 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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章