【问题标题】:Efficiently processing large binary files in python在 python 中有效地处理大型二进制文件
【发布时间】:2018-10-11 09:12:05
【问题描述】:

我目前正在读取每个 150,000 kb 的二进制文件。它们包含大约 3,000 条结构化二进制消息,我正在尝试找出处理它们的最快方法。在每条消息中,我实际上只需要读取大约 30 行数据。这些消息的标题允许我跳转到消息的特定部分并找到我需要的数据。

我试图弄清楚解压整个消息(每条 50 kb)并从包含大量我实际上并不需要的数据的结果元组中提取我的数据是否更有效,还是成本更低使用 seek 转到每条消息所需的每一行数据并解压缩这 30 行中的每一行?或者,这是否更适合 mmap?

【问题讨论】:

  • 30“行”是什么意思?数据是二进制的,所以行没有多大意义。你能用每条消息的百分比来表示吗?此外,除非百分比接近 100% 或 0%,否则您可能需要进行分析才能获得有用的答案。
  • 对不起,你说得对,一点都不清楚。 30 个 8 字节的二进制段。
  • 它们在整个消息中是如何分布的?它们是随机放置的,还是都在一个区域中,还是介于两者之间?
  • 它们遵循固定的结构,尽管消息在消息之间的大小是一致的,但它们可能因文件而异。我的计划是读取消息的标题以确定大小并构建格式字符串来解包整个消息,然后从元组中提取数据。或者,我可以使用消息标头找出需要跳过多少字节才能到达我想要阅读的消息部分,然后我可以解压缩该单个二进制数据以检索变量。
  • 我只是不确定跳过消息来解包 30 个整数是否会比解包数百个整数的单个解包操作慢。

标签: python python-3.x binary-data


【解决方案1】:

在 50 kB 范围内可能多次寻找可能是不值得的:系统调用代价高昂。相反,将每条消息读入一个 bytes 并使用切片来“寻找”您需要的偏移量并获取适量的数据。

bytes 包装在memoryview 中以避免复制可能是有益的,但对于小型个人阅读而言,这可能并不重要。如果您可以使用memoryview,请务必尝试使用mmap,它会在整个文件中公开类似的界面。如果您使用的是struct,它的unpack_from 已经可以在bytesmmap 内查找,而无需包装复制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2014-06-25
    • 2017-01-04
    • 1970-01-01
    相关资源
    最近更新 更多