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

时间:2018-08-02 18:10:06

标签: string file null stream

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

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

for i in xrange(512):
    if set(f.read(64*1048576))!=set(['\x00']):
        print i
        break

这很好(实际上,它在图像的最后显示了一些数据),但是花费了超过9分钟的时间。

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

1 个答案:

答案 0 :(得分:1)

看着guide about memory buffers in python here,我怀疑比较器本身就是问题所在。在大多数非类型化语言中,内存拷贝尽管会降低性能,但却不是很明显。

在这种情况下,如Oded R.建立的那样,从读取中创建缓冲区并将结果与​​先前准备的nul填充的缓冲区进行比较会更加有效。

size = 512
data = bytearray(size)
cmp = bytearray(size)

阅读时:

f = open(FILENAME, 'rb')
f.readinto(data)

需要考虑的两件事是:

  • 比较的缓冲区的大小应该相等,但是比较较大的缓冲区应该更快,直到某个时刻为止(我希望内存碎片成为主要限制)
  • 最后一个缓冲区的大小可能不一样,将文件读入准备好的缓冲区会将尾随零保留在我们想要的位置。

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