有没有一种快速确定从文件中读取的(4KB-16MB)块是否全部为零的方法?
您可以遍历该块,检查每个字节。 有明显的优化,但它仍然是O(N)。
我的用例是稀疏文件。 如果刚刚读取的块未由任何磁盘存储支持(即它是一个空洞),那么我将非常满意部分解决方案,即返回true。
有什么提示吗?
有没有一种快速确定从文件中读取的(4KB-16MB)块是否全部为零的方法?
您可以遍历该块,检查每个字节。 有明显的优化,但它仍然是O(N)。
我的用例是稀疏文件。 如果刚刚读取的块未由任何磁盘存储支持(即它是一个空洞),那么我将非常满意部分解决方案,即返回true。
有什么提示吗?
FIEMAP
ioctl()
,而Solaris上的ZFS在lseek()
中实现了SEEK_HOLE
和SEEK_DATA
。FIEMAP
将在文件描述符上工作。 - caf我的第一个想法是:“rsync是如何做到的?”
事实证明,rsync只是检查数据中的零块,并将它们写成稀疏文件。如果您想了解详细信息,请参阅rsync源代码中的fileio.c
。