是否有一种快速确定从(稀疏)文件中读取的数据块是否全为零的方法?

3

有没有一种快速确定从文件中读取的(4KB-16MB)块是否全部为零的方法?

您可以遍历该块,检查每个字节。 有明显的优化,但它仍然是O(N)。

我的用例是稀疏文件。 如果刚刚读取的块未由任何磁盘存储支持(即它是一个空洞),那么我将非常满意部分解决方案,即返回true。

有什么提示吗?


4
我认为这个问题与操作系统API更相关,而不是任何特定的编程语言。 - Vladimir Panteleev
1
如果有一种方法,那很可能是(V)FS API特定的...所以这将取决于操作系统和文件系统本身。 - Nico
@David Linux(EXT3/4)和Windows(NTFS)。据我所知,OSX不支持稀疏文件。 - fadedbee
2个回答

3
这取决于操作系统以及有时也与文件系统有关。自2.6.28以来,Linux已经实现了FIEMAP ioctl(),而Solaris上的ZFS在lseek()中实现了SEEK_HOLESEEK_DATA

1
顺便提一下,在即将发布的3.1内核中,Linux还实现了SEEK_HOLE/SEEK_DATA。 - janneb
这在内存映射文件上也不起作用吧?看起来很合理。 - fadedbee
@chrisdew:如果您在创建mmap后保持文件描述符打开,则FIEMAP将在文件描述符上工作。 - caf

2

我的第一个想法是:“rsync是如何做到的?”

事实证明,rsync只是检查数据中的零块,并将它们写成稀疏文件。如果您想了解详细信息,请参阅rsync源代码中的fileio.c


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接