首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是稀疏文件?我们为什么需要它?

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

Stack Overflow用户
提问于 2017-03-31 03:26:06
回答 2查看 16.2K关注 0票数 25

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-06 00:42:08

假设您有一个包含许多空字节\x00的文件。这些空字节的\x00被称为空洞。存储空字节效率很低,我们知道文件中有很多空字节,那么为什么要将它们存储在存储设备上呢?我们可以存储描述这些零的元数据。当进程读取文件时,这些零字节块是动态生成的,而不是存储在物理存储上(参见Wikipedia中的示意图):

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

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

编辑:

当你运行时:

代码语言:javascript
复制
$ dd if=/dev/zero of=output bs=1G count=4

这里的命令将空字节的4G块复制到output。要了解这一点,请执行以下操作:

代码语言:javascript
复制
$ stat output
File: ouput
  Size: 4294967296      Blocks: 8388616    IO Block: 4096   regular file
--omitted--

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

现在,运行以下命令以检测漏洞并使文件就地稀疏:

代码语言:javascript
复制
$ 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报告的文件大小是逻辑大小,而output的物理大小是零。在这种情况下,当进程读取文件时,文件系统必须生成4G的空字节。

要使用dd生成稀疏文件,请执行以下操作:

代码语言:javascript
复制
$ 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在内部使用lseekftruncate,因此请检查truncate(2)和lseek(2)。

票数 24
EN

Stack Overflow用户

发布于 2017-09-04 20:32:02

稀疏文件是大多数为空的文件,即它包含值为0 (零)的大块字节块。

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

使用稀疏文件的优点:

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

有关稀疏文件的更多信息可以在Wikipedia page上找到。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43126760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档