如果我有一个包含很多零的大文件,我如何有效地使它成为一个稀疏文件?如何让文件稀疏?
是唯一可能读取整个文件(包括所有零,可能patrially存储稀疏),并重写它到一个新的文件使用寻求跳过零区?
或者是否有可能在现有的文件中做到这一点(例如File.setSparse(long start,long end))?
我正在寻找Java或某些Linux命令的解决方案,Filesystem将是ext3或类似的。
如果我有一个包含很多零的大文件,我如何有效地使它成为一个稀疏文件?如何让文件稀疏?
是唯一可能读取整个文件(包括所有零,可能patrially存储稀疏),并重写它到一个新的文件使用寻求跳过零区?
或者是否有可能在现有的文件中做到这一点(例如File.setSparse(long start,long end))?
我正在寻找Java或某些Linux命令的解决方案,Filesystem将是ext3或类似的。
Linux/UNIX上的某些文件系统可以对现有文件“打洞”。请参阅:
这不是很便携,没有做全线以同样的方式;截至目前,我相信Java的IO库不提供这个接口。
如果可以通过fcntl(F_FREESP)
或通过任何其他机制获得打孔,它应该比复制/查找循环快得多。
根据这article,似乎目前没有简单的解决方案,除了使用FIEMAP ioctl。但是,我不知道如何将“非稀疏”零块变成“稀疏”块。
我认为你最好预先分配整个文件并维护占用的页面/段的表/位集。
使文件稀疏会导致这些部分被分割,如果它们曾被重复使用过。也许节省几TB的磁盘空间并不值得高度碎片化文件的性能。
您可以使用$ truncate -s filename filesize
在Linux端子短以形成具有
只有稀疏的元数据文件。
注 - 文件大小以字节为单位。
第一个解决方案是在'cp --sparse = always'中实现的,但这不是高效的,需要复制文件并随后移动。 – rurouni 2011-05-13 08:39:41
http://stackoverflow.com/questions/245251/create-file-with-given-size-in-java – joe776 2011-05-13 08:41:55
@joe:这是关于从头开始创建一个稀疏文件,但我希望使现有的文件稀疏。 – rurouni 2011-05-13 08:45:39