【发布时间】:2019-01-10 14:13:17
【问题描述】:
我有一个相当大的文件 (32 GB),它是一张 SD 卡的映像,使用 dd 创建。 我怀疑文件从某个点开始是空的(即用空字节\x00填充)。
我通过以下方式使用 python 进行了检查(其中 f 是一个打开的文件句柄,光标位于我可以找到数据的最后一个位置):
for i in xrange(512):
if set(f.read(64*1048576))!=set(['\x00']):
print i
break
这很有效(实际上它在图像的最后显示了一些数据),但花了 >9 分钟。
有没有人有更好的方法来做到这一点?肯定有更快的方法,我敢肯定,但想不出一个。
【问题讨论】:
-
您可以尝试尽可能少的 IO(控制块大小以对更大的块进行比较)并尝试流式传输,但通常您需要读取整个文件 - 这意味着整个文件需要阅读。您可以尝试用 ANSI C 编写此代码,但不能保证显着加速。
-
谢谢@MichałKapracki。我同意必须阅读整个文件,但绝对不应该花这么长时间。例如,以非常相似的方法在同一个 32 GB 文件中搜索字符串大约需要 90 秒。所以 set(s) == set(['\x00']) 绝对是这里的速率限制步骤,而不是文件 IO。
-
好吧,我的 python 技能真的很烂,所以我不确定实际的比较器是如何工作的。我很确定虽然您将内存指针转换为字符串,但这需要时间 - 也许有一种方法来比较缓冲区?如果是这样 - 那么你可以准备一个
nul填充的缓冲区,比如说 16k 并一个接一个地比较。 -
看看这里:eli.thegreenplace.net/2011/11/28/… - 这对你来说可能很有趣。
-
@MichałKapracki 你的第二个想法——在内存中存储一个空缓冲区并使用字符串比较——非常棒并且工作得很好(速度提高了 2.5 倍,如果我优化缓冲区大小可能会更好)。谢谢!请务必将其写为答案,以便我接受。