2011-05-13 97 views
8

如果我有一个包含很多零的大文件,我如何有效地使它成为一个稀疏文件?如何让文件稀疏?

是唯一可能读取整个文件(包括所有零,可能patrially存储稀疏),并重写它到一个新的文件使用寻求跳过零区?

或者是否有可能在现有的文件中做到这一点(例如File.setSparse(long start,long end))?

我正在寻找Java或某些Linux命令的解决方案,Filesystem将是ext3或类似的。

+3

第一个解决方案是在'cp --sparse = always'中实现的,但这不是高效的,需要复制文件并随后移动。 – rurouni 2011-05-13 08:39:41

+1

http://stackoverflow.com/questions/245251/create-file-with-given-size-in-java – joe776 2011-05-13 08:41:55

+0

@joe:这是关于从头开始创建一个稀疏文件,但我希望使现有的文件稀疏。 – rurouni 2011-05-13 08:45:39

回答

3

Linux/UNIX上的某些文件系统可以对现有文件“打洞”。请参阅:

这不是很便携,没有做全线以同样的方式;截至目前,我相信Java的IO库不提供这个接口。

如果可以通过fcntl(F_FREESP)或通过任何其他机制获得打孔,它应该比复制/查找循环快得多。

+0

你知不知道是否有一个工具将它应用到文件中,因为我不是经验丰富的C黑客。 – rurouni 2011-05-13 11:13:50

+0

高质量的答案。谢谢 – sehe 2012-01-04 22:51:41

0

根据这article,似乎目前没有简单的解决方案,除了使用FIEMAP ioctl。但是,我不知道如何将“非稀疏”零块变成“稀疏”块。

2

我认为你最好预先分配整个文件并维护占用的页面/段的表/位集。

使文件稀疏会导致这些部分被分割,如果它们曾被重复使用过。也许节省几TB的磁盘空间并不值得高度碎片化文件的性能。

0

您可以使用$ truncate -s filename filesize在Linux端子短以形成具有

只有稀疏的元数据文件。

注 - 文件大小以字节为单位。