String 什么是检查文件内容是否为空的快速方法?

String 什么是检查文件内容是否为空的快速方法?,string,file,null,stream,String,File,Null,Stream,我有一个相当大的文件(32GB),它是一个SD卡的映像,使用dd创建。 我怀疑该文件从某个点开始是空的(即填充了空字节\x00) 我使用python以以下方式对此进行了检查(其中f是一个打开的文件句柄,光标位于我可以找到数据的最后一个位置): 这很有效(事实上,它在图像的最后显示了一些数据),但耗时>9分钟 有人有更好的方法吗?我肯定会有一种更快的方法,但我想不出一种。看着一个例子,我怀疑比较器本身就是问题所在。在大多数非类型化语言中,内存拷贝不是很明显,尽管它是性能的杀手 在这种情况下,正如O

我有一个相当大的文件(32GB),它是一个SD卡的映像,使用dd创建。 我怀疑该文件从某个点开始是空的(即填充了空字节\x00)

我使用python以以下方式对此进行了检查(其中f是一个打开的文件句柄,光标位于我可以找到数据的最后一个位置):

这很有效(事实上,它在图像的最后显示了一些数据),但耗时>9分钟

有人有更好的方法吗?我肯定会有一种更快的方法,但我想不出一种。

看着一个例子,我怀疑比较器本身就是问题所在。在大多数非类型化语言中,内存拷贝不是很明显,尽管它是性能的杀手

在这种情况下,正如Oded R.建立的那样,从读取中创建一个缓冲区,并将结果与先前准备的
nul
填充的结果进行比较,效率要高得多

size = 512
data = bytearray(size)
cmp = bytearray(size)
阅读时:

f = open(FILENAME, 'rb')
f.readinto(data)
需要考虑的两件事是:

  • 比较的缓冲区的大小应该相等,但是比较较大的缓冲区应该更快,直到某一点(我认为内存碎片是主要限制)
  • 最后一个缓冲区的大小可能不同,将文件读入准备好的缓冲区将使尾随零保持在我们想要的位置

在这里,两个缓冲区的比较会很快,并且不会尝试将字节转换为字符串(我们不需要),而且由于我们一直重复使用相同的内存,垃圾收集器也不会有太多工作…:)

您可以尝试尽可能少的IO(控制块大小以便在较大的块上进行比较)并尝试流式传输,但通常您需要读取整个文件-这意味着需要读取整个文件。你可以试着用ANSIC写这篇文章,但是不能保证会有很大的加速。谢谢@MichałKapracki。我同意必须读取整个文件,但绝对不应该花费这么长的时间。例如,用一种非常相似的方法在同一个32GB文件中搜索一个字符串大约需要90秒。所以set(==set(['\x00'])肯定是这里的速率限制步骤,而不是文件IO。嗯,我的python技能真的很差,所以我不确定实际的比较器是如何工作的。我很确定,虽然要将内存指针转换为字符串,但这需要时间——也许有一种方法可以比较缓冲区?如果是这样的话-那么你可以准备一个填充了
nul
的缓冲区,比如说16k,然后一个接一个地比较。看看这里:-这对你来说可能很有趣。@MichałKapracki你的第二个想法-在内存中存储一个空缓冲区并使用字符串比较-非常棒,效果非常好(速度提高了2.5倍,如果我优化缓冲区大小,可能会更好)。谢谢!请写下来作为答案,以便我可以接受。
f = open(FILENAME, 'rb')
f.readinto(data)