我有一个相当大的文件(32 GB(,它是使用dd创建的SD卡映像。我怀疑文件从某个点开始是空的(即用空字节\x00填充(。
我使用python以以下方式检查了这一点(其中f是一个打开的文件句柄,光标位于我可以找到数据的最后一个位置(:
for i in xrange(512):
if set(f.read(64*1048576))!=set(['x00']):
print i
break
这很有效(事实上,它在图像的最后显示了一些数据(,但花费了9分钟以上。
有人能找到更好的方法吗?肯定有更快的方法,但我想不出。
在这里查看关于python中内存缓冲区的指南时,我怀疑比较器本身就是问题所在。在大多数非类型语言中,内存拷贝并不是很明显,尽管它是性能的杀手。
在这种情况下,正如Oded R.所建立的那样,通过读取创建缓冲区并将结果与先前准备的nul
填充的缓冲区进行比较要有效得多。
size = 512
data = bytearray(size)
cmp = bytearray(size)
阅读时:
f = open(FILENAME, 'rb')
f.readinto(data)
需要考虑的两件事是:
- 比较缓冲区的大小应该相等,但比较较大的缓冲区应该更快,直到某个时候(我认为内存碎片是主要限制(
- 最后一个缓冲区的大小可能不同,将文件读取到准备好的缓冲区中会将尾部的零保留在我们想要的位置
在这里,两个缓冲区的比较将很快,不会尝试将字节强制转换为字符串(我们不需要(,而且由于我们一直在重用相同的内存,垃圾收集器也不会有太多工作…:(