稀疏文件

编辑
本词条由“匿名用户” 建档。

一个稀疏文件,表示一个文件可以紧凑地存储在文件系统中,因为它包含的数据少于指定的文件大小-所以它包含部分内容不确定。在一个稀疏文件中,已经包含数据的区域与尚未写入的区域交替出现。这些未写入的区域不需要在文件系统中分配空间。 对于包含具有不确定内容的(大)区域的文件,它是一种节省空间的存储形式。这种类型的存储来自基于inode的文件系统。通常,文件系统指定这些不确定区域在读取访问期间显示为零字符序列...

稀疏文件

编辑

一个稀疏文件,表示一个文件可以紧凑地存储在文件系统中,因为它包含的数据少于指定的文件大小 - 所以它包含部分内容不确定。 在一个稀疏文件中,已经包含数据的区域与尚未写入的区域交替出现。 这些未写入的区域不需要在文件系统中分配空间。

基础知识

编辑

对于包含具有不确定内容的(大)区域的文件,它是一种节省空间的存储形式。 这种类型的存储来自基于 inode 的文件系统。 通常,文件系统指定这些不确定区域在读取访问期间显示为零字符序列。 类 Unix 操作系统NTFS 和 APFS 的现代文件系统支持此选项。

对于一个稀疏文件,只有那些部分存储在后台内存中,其中数据实际上已被写入。 当块在文件内的不同位置写入文件时,可能会产生此类文件,从而使这些块不连续。 这会在文件中创建没有定义内容的区域。 所以例如 例如,标称长度为 100 GiB 的文件实际上只包含文件系统中的一个逻辑块,例如,如果数据仅写入文件中的一个点。

并非所有文件和操作系统都支持末尾有未定义区域的稀疏文件。

这种存储形式对于某些形式的二进制数据库以及将分区映射到文件(例如在虚拟化中)非常有用。

打孔

编辑

虽然最初不可能在空间被占用后重新获得空间,但 Linux 内核 2.6.38 和更高版本可以选择使用 fallocate 系统调用在文件中打孔。 在支持的文件系统上,整个数据块在数据载体上的打孔区域中再次释放。 从内核版本 3.2 开始,相应的数据块也已使用 TRIM 命令在数据存储本身上释放,如果支持的话 - 许多基于闪存的存储介质都是这种情况,例如 SSD。

使用问题

编辑

稀疏文件复制时可能会导致问题:当复制到另一个不支持稀疏文件的文件系统时,目标文件无法以压缩形式创建。 因此,源文件的未定义区域在目标文件中被写入为空字符。 这提供了一个明显更大的目标文件。 目标文件系统必须有足够的容量。 此外,目标的复制或备份程序和操作系统都必须支持稀疏文件并能够识别它们。

要保存的文件通常不会由操作系统自动创建为稀疏文件,但是创建/使用文件的应用程序必须为此使用单独的操作系统例程 - 大多数操作系统不会“自动”创建稀疏文件。

在经典的可直接寻址数据存储设备(例如硬盘)上,由于其固有的碎片,稀疏文件会导致线性读取访问期间的速度损失。 但是,对于基于闪存的存储介质(例如 SSD),情况并非如此。

NTFS 稀疏

编辑

与第 3 版的基于 Unix 的文件系统相比,Windows 文件系统 NTFS 具有特殊的文件属性,该属性导致 Windows 文件系统的输入/输出子系统不会为文件的连续区域占用数据介质上的任何内存仅包含零值。

常数据和压缩数据都可以被 NTFS 视为稀疏文件。 在 Windows Server 2003 和 Windows XP 下,一旦文件被声明为稀疏文件,NTFS 就不能再将其转换为普通文件。 对于更高版本的 Windows,这只有在不再有任何漏洞时才有可能。

基于 Unix 的文件系统所提到的问题原则上以与 NTFS 相同的方式存在,尽管文件属性确保至少根据通用编程指南编写的程序可以透明地复制稀疏文件 en 而不会丢失稀疏属性。

在 Unix 和类似系统上处理稀疏文件

编辑

生成稀疏文件

可以使用 Unix 命令 dd 创建稀疏文件

此示例命令通过查找指向位置 9999999 的写指针然后写入一个字节来创建一个 10 兆字节的稀疏文件。

他以“洞”结尾的稀疏文件的证据只能通过某些 dd 实现间接实现。 为此,必须首先创建一个以写入数据结尾的文件,如上例所示。 然后可以使用 truncate() 或 ftruncate() 系统调用删除文件的最后数据部分。 例如,这适用于 Solaris。 对于 Linux,设置 count=0 就足以防止在“洞”之后写入数据。 在 Linux 上,如果设置了 count=0,则只执行 ftruncate() 而没有写操作,这会创建一个稀疏文件,其中没有非零字节字符。

识别稀疏文件

对于稀疏文件,逻辑和物理文件大小不同。 虽然逻辑文件大小也包括零字节,但物理文件大小表示文件在文件系统中实际需要的空间。

Unix ls 命令的 -s 选项也显示物理文件大小,但以块为单位。 使用 -k 逻辑大小也以块显示,使用 -h 两者都以人类可读的格式显示:

ls -lhs 稀疏文件 ls -lks 稀疏文件

或者,可以使用 Unix 命令 du 显示逻辑文件大小,但最初也是以块为单位。 --block-size 1 选项以字节为单位显示物理大小,而 --bytes 以字节为单位显示逻辑大小:

du --block-size 1 稀疏文件 du --bytes 稀疏文件

应用实例

下面生成一个10MB的稀疏文件。 与一个 3MB 的文件进行比较时,仅通过简单的 du 调用就可以看出它是一个稀疏文件,只需要占用 10 个硬盘块。

稀疏文件

在 Microsoft Windows 上处理稀疏文件

编辑

生成稀疏文件

可以使用 Windows 命令 fsutil 将文件标记为稀疏文件:

fsutil sparse setflag ;

结果,在以后的写入操作中,文件的未写入区域不会分配给数据介质。 该命令还可用于释放标记为稀疏文件的文件的现有区域:

fsutil sparse setrange ; <字节长度>

这将取消分配指定的范围。 请注意,只有长度是 64KiB 的倍数且起始位置是 64KiB 的倍数的完整块才能被释放。

要以编程方式执行这些操作,DeviceIoControl 内核函数可以与 FSCTL_SET_SPARSE 和 FSCTL_SET_ZERO_DATA 控制代码一起使用。 后一种代码也适用于非稀疏文件的文件,但数据区域未被释放,而是填充了零字节。

识别稀疏文件

一个文件是否是一个稀疏文件也可以用 fsutil 命令来判断:

fsutil sparse queryflag ;

要列出实际分配的区域,调用命令如下:

fsutil sparse queryrange ;

使用 MSSQL 创建稀疏文件

从 2005 版开始,MSSQL 创建的稀疏文件可以作为数据库快照。 以下 SQL 语句创建一个大小为 2 GB 的稀疏文件。

内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/358184/

(10)
词条目录
  1. 稀疏文件
  2. 基础知识
  3. 打孔
  4. 使用问题
  5. NTFS 稀疏
  6. 在 Unix 和类似系统上处理稀疏文件
  7. 生成稀疏文件
  8. 识别稀疏文件
  9. 应用实例
  10. 在 Microsoft Windows 上处理稀疏文件
  11. 生成稀疏文件
  12. 识别稀疏文件
  13. 使用 MSSQL 创建稀疏文件

轻触这里

关闭目录

目录