有没有一种方法可以快速确定从文件中读取的(4KB-16MB)块是否全为零?
您可以遍历块,检查每个字节。有明显的优化,但仍然是 O(N)。
我的用例是稀疏文件。对于部分解决方案,我会非常高兴,这样如果我刚刚读取的块没有任何磁盘存储支持(即它是一个孔),则返回 true。
有什么提示吗?
有没有一种方法可以快速确定从文件中读取的(4KB-16MB)块是否全为零?
您可以遍历块,检查每个字节。有明显的优化,但仍然是 O(N)。
我的用例是稀疏文件。对于部分解决方案,我会非常高兴,这样如果我刚刚读取的块没有任何磁盘存储支持(即它是一个孔),则返回 true。
有什么提示吗?
这取决于操作系统,有时还取决于文件系统。自 2.6.28 以来的 Linux 已经实现了FIEMAP
ioctl()
, Solaris 上SEEK_HOLE
的ZFSSEEK_DATA
在lseek()
.
我的第一个想法是,“rsync 是如何做到的?”
事实证明,rsync 只是检查数据中的零块,并将它们写入稀疏文件。fileio.c
如果你想要血淋淋的细节,请参阅rsync 源代码。