【问题标题】:fastest way to parse large binary file in python在python中解析大型二进制文件的最快方法
【发布时间】:2015-03-27 12:07:06
【问题描述】:

我有大约数十 GB 的文件,这些文件由 10 个左右的压缩 C 结构混合而成。我需要能够遍历文件中的每个结构进行分析,并希望能够在 python 代码中进行这种分析。我根本不需要写入文件。

我不认为 numpy 在这里可以提供帮助,因为文件不仅仅是一个重复的结构。我发现 struct.unpack 太慢了。

到目前为止,我的想法是使用 Cython 并 mmap 文件,然后迭代并将缓冲区转换为 Cython C 结构,希望避免任何不必要的复制。不过,我在使用这种方法时遇到的问题是我不能直接使用 Cython C 结构指针,并且需要有效地编写 python 包装类,这使得编写起来有点慢和乏味。有谁知道解决这个问题的方法吗?

想知道是否还有其他可行的方法?我还没有考虑ctypes。

【问题讨论】:

  • 我实际上使用struct.unpack 处理大型二进制文件并且没有真正的速度问题。您是否尝试过使用PyPy?我认为,由于struct.unpack 使用的是简单类型,它应该可以通过PyPy 进行高度优化,因此它可能会为您提供所需的速度提升。
  • @septi 我的基本 Cython 实现需要 2 秒,而 CPython 中的 struct.unpack 需要 76 秒,pypy 需要 26 秒

标签: python parsing binary cython mmap


【解决方案1】:

您确定复制确实是问题所在吗?这样的事情对你来说已经太慢了?

st = struct.Struct('>QLB')  # whatever
while True:
    data = fp.read(st.size)
    if not data:
        break
    a, b, c = st.unpack(data)
    do_something_with(a, b, c)

如果是这样,也许使用 mmap 和 struct.unpack_from 可以让您更快一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    相关资源
    最近更新 更多