本页使用了标题或全文手工转换

稀疏文件

维基百科,自由的百科全书
跳转至: 导航搜索
稀疏文件:空字节不需要保存,只需要通过元数据定义。

稀疏文件英语:sparse file)是一种计算机文件,它能尝试在文件内容大多为空时更有效率地使用文件系统的空间。它的原理是以简短的信息(元数据)表示空数据块,而不是在在磁盘上占用实际空间来存储空数据块。只有真实(非空)的数据块会按原样写入磁盘。

在读取稀疏文件时,文件系统会按元数据在运行时将这些透明转换为“真实”的数据块,即填充为零。应用程序不会察觉这个转换。

大多数现代的文件系统支持稀疏文件,包括大多数Unix变种和NTFS[1]苹果的HFS+不提供稀疏文件支持,但在OS X中,虛擬檔案系統层支持在任何受支持文件系统中存储稀疏文件,包括HFS+。2016年6月在WWDC宣布的苹果文件系统(APFS[2])支持稀疏文件。稀疏文件常被用在磁盘映像数据库快照、日志文件和科学应用中。

优势[编辑]

稀疏文件的优势是,它分配的存储空间只在需要时使用:这样节省了磁盘空间,并且可以创建很大的文件,即使文件系统中的可用空间不足。这也减少了首次写入的时间,因为系统不会分配“跳过”的空间。如果初始分配需要写入全零到空间,这也使得系统不必写入两次。

缺点[编辑]

稀疏文件的缺点包括:稀疏文件可能碎片化;文件系统的空余空间报告可能产生误导;包含稀疏文件的文件系统被填满可能产生意外效果,例如只是重写现有文件的内容时遭遇磁盘已满或超出配额错误——开发者未预料到文件可能被稀疏;使用非显式支持的计算机程序复制稀疏文件可能会复制整个内容,即未压缩的文件大小,包括未实际在磁盘上分配的零空间——也就是使稀疏文件失去稀疏属性。稀疏文件也不是被所有备份软件和应用支持。不过,VFS的实现回避了先前两个缺点。在Windows上加载稀疏的可执行文件(exe或dll)可能需要更多时间,因为文件不被映射到内存和缓存。

Unix中的稀疏文件[编辑]

稀疏文件通常对用户透明(不可见)处理。但在某些情况下,稀疏文件会与正常文件显现出差异。

创建[编辑]

Unix命令:

 dd of=sparse-file bs=1k seek=5120 count=0

将创建一个5MB大小的文件,但不在磁盘上存储数据(仅存储元数据)。(GNU dd也有此表现,因为它调用ftruncate来设置文件大小;其他实现可能是只创建一个空文件)。 如果truncate命令可用,也可以使用它:

 truncate -s 5M <filename>

删除[编辑]

ls命令的-s选项会以块为单位显示已占用的空间。

 ls -ls sparse-file

或者,du命令将打印占用的空间,而ls打印明面的大小。在一些非标准的du版本中,--block-size=1选项打印字节而非块单位的占用空间,因而可以与ls的输出比较:

 du --block-size=1 sparse-file
 ls -l sparse-file

复制[编辑]

一般来说,GNU版本的cp是检测文件是否为稀疏文件的较好方式,所以

cp sparse-file new-file

创建一个新文件,它将是稀疏性质。但是,GNU版本的cp没有--sparse=WHEN选项。[3]这尤为有用,如果一个已保存文件包含长串零块且非稀疏方式保存(即长串的零块已被完全写入并占用磁盘空间)。用此命令可以节省磁盘空间:

cp --sparse=always file1 file1_sparsed

在某些例如FreeBSD的cp实现中,--sparse选项不被支持,将始终展开稀疏文件。这些系统上的可行替代方案是使用rsync--sparse选项[4]代替cp。遗憾的是--sparse无法与--inplace组合使用,因此通过网络rsync巨大文件时始终会浪费网络和磁盘带宽。

通过标准输入[编辑]

 cp --sparse=always /proc/self/fd/0 new-sparse-file < somefile

参见[编辑]

参考资料[编辑]

  1. ^ Giampaolo, Dominic. Practical File System Design with the Be File System (PDF). Morgan Kaufmann Publishers. 1999. ISBN 9781558604971. 
  2. ^ General Characteristics. Apple Inc. [2016-06-17]. 
  3. ^ Jim Meyering. GNU coreutils/cp: Accept new option, --sparse={never,auto,always}, to control creation of sparse files.. 1995-12-21 [2016-06-17]. 
  4. ^ Tridgell, Andrew. rsync: hard links, better sparse handling, FERROR and FINFO. 1996-06-29 [2016-06-17]. 

外部链接[编辑]