【问题标题】:What is a quick way to check if file contents are null?检查文件内容是否为空的快速方法是什么?
【发布时间】: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 倍,如果我优化缓冲区大小可能会更好)。谢谢!请务必将其写为答案,以便我接受。

标签: string file null stream


【解决方案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)

需要考虑的两件事是:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 2010-10-19
    • 2021-09-05
    • 2020-01-17
    • 2015-10-26
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多