Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使文件稀疏?_Java_Linux_File_Sparse File - Fatal编程技术网

Java 如何使文件稀疏?

Java 如何使文件稀疏?,java,linux,file,sparse-file,Java,Linux,File,Sparse File,如果我有一个包含许多零的大文件,如何有效地使其成为稀疏文件 是否只有读取整个文件(包括所有零值,这些零值可能以稀疏方式存储)并使用seek将其重写为新文件才能跳过零区域 或者是否有可能在现有文件(例如file.setSparse(long start,long end))中执行此操作 我正在寻找Java或一些Linux命令的解决方案,文件系统将是ext3或类似的。根据这一点,目前似乎没有简单的解决方案,除了使用FIEMAP ioctl。但是,我不知道如何将“非稀疏”零块转换为“稀疏”块 我认为您

如果我有一个包含许多零的大文件,如何有效地使其成为稀疏文件

是否只有读取整个文件(包括所有零值,这些零值可能以稀疏方式存储)并使用seek将其重写为新文件才能跳过零区域

或者是否有可能在现有文件(例如file.setSparse(long start,long end))中执行此操作


我正在寻找Java或一些Linux命令的解决方案,文件系统将是ext3或类似的。

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

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


如果重复使用,使文件稀疏将导致这些部分变得支离破碎。也许节省几TB的磁盘空间不值得一个高度碎片化的文件对性能的影响

Linux/UNIX上的某些文件系统能够在现有文件中“打孔”。见:

  • (搜索F_FREESP)
它不是很便于携带,也不是一刀切地以同样的方式完成的;到目前为止,我相信Java的IO库没有为此提供接口


如果可以通过
fcntl(F_FREESP)
或任何其他机制进行打孔,则打孔速度应该比复制/搜索循环快得多。

您可以在linux终端上使用
$truncate-s filename filesize
创建稀疏文件

只有元数据


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

8年来发生了很大变化

休闲
fallocate-d
filename
可用于在现有文件中打孔。从:

-d,--挖洞
探测并挖洞。这会使文件在适当的位置稀疏,
无需使用额外的磁盘空间。孔的最小尺寸
取决于文件系统I/O块大小(通常为4096字节)。
此外,当使用此选项时,将暗示-keep size。如果没有
范围由--offset和--length指定,然后是整个
分析文件中的孔。
您可以将此选项视为执行“cp--sparse”,然后
将目标文件重命名为原始文件,而不使用
需要额外的磁盘空间。
有关受支持的文件系统的列表,请参见--punch hole。
(该名单:)

XFS(自Linux 2.6.38起)和ext4(自Linux起)支持

Btrfs(自Linux 3.7起)和tmpfs(自Linux 3.5起)。
tmpfs在这个名单上是我觉得最有趣的一个。文件系统本身的效率足以只消耗存储其内容所需的内存,但使内容稀疏可能会进一步提高效率

GNU
cp
此外,GNU
cp
在某种程度上理解了稀疏文件。引用有关其默认模式的命令,
--sparse=auto

稀疏源文件通过粗略的启发式检测,相应的DEST文件也变为稀疏

但是还有一个
--sparse=always
,它激活了与
fallocate-d
相同的文件副本:

指定
--sparse=always
,以便在源文件包含足够长的零字节序列时创建稀疏DEST文件


我终于能够退出我的
tar cpSf-SOURCE |(cd DESTDIR&&tar xpSf-)
1行程序,20年来,它一直是我复制稀疏文件并保留其稀疏性的方式。

第一个解决方案是在“cp--sparse=always”中实现的,但这样做效率不高,需要复制文件,然后再移动。@joe:这是关于从头开始创建稀疏文件,但我希望ta将现有文件稀疏。@runouni,如果孔足够大,也许分解文件并使用文件系统删除/删除节是值得的。如果重复使用这些节,使文件稀疏将导致这些节碎片化。我认为您最好预先分配整个文件,并维护占用的页面/节的表/位集。也许节省几TB的磁盘空间不值得一个高度碎片化的文件的性能损失。你知道是否有一个工具将此应用于一个文件,因为我不是一个经验丰富的C黑客。在Linux中,使用
fallocate
中的
FALLOC\u FL\u PUNCH\u HOLE
标志。这里有两个问题:(1)你的参数是反向的,它应该是
truncate-s size filename
。(大小实际上可以是任何指定的单位,例如
10K
=10240字节,
2MB
=2000000字节)。(2) 该问题询问如何使现有文件稀疏,而这只会创建一个新的稀疏文件(或在末尾扩展一个具有稀疏区域的现有文件)。谢谢。你对GNU cp的提示帮助了我。当其他工具(例如
rsync--sparse
)运行缓慢时,它的工作速度很快。