【问题标题】:Search string with regex in large binary file (2 GB or more)在大型二进制文件(2 GB 或更多)中使用正则表达式搜索字符串
【发布时间】:2015-05-17 03:10:09
【问题描述】:

使用正则表达式在大型二进制文件(2 GB 或更多)中搜索(多个)字符串的最佳方法是什么。

二进制数据只是“原始”数据(如内存转储),字符串没有界限。

我可以通过逐行读取文件来在大型文本文件中执行此操作。 我想我需要分块读取文件,但是存在边界风险(匹配位于块边界上)

如何搜索二进制数据。

非常感谢一个简短的例子。

编辑: 我没有看到相似之处。这一点我也不清楚

【问题讨论】:

  • Python regex parse stream 的可能重复项
  • 不是严格的重复。 'duplicate' question 假设一个流(答案是'不支持')。这个问题问“我该如何处理大文件?”没有假设这种流方法并继续明确提及边界..不投票关闭。
  • 使用什么正则表达式?它是如何/有界的?
  • 更新了我的问题。

标签: python regex python-2.7 binary


【解决方案1】:

read() 采用一个数值表示有多少个字符(字节?多字节字符总是让我感到困惑),因此您可以分块读取它,尽可能多地保存,检查您的正则表达式。随着空间成为一个问题,也许在您阅读下一个块之前只删除您已阅读内容的开头。这取决于至少有一些猜测作为正则表达式的长度,或者更确切地说,是它的上限。如果您要匹配的正则表达式包含的数量超过了您一次可以在内存中拥有的数量,那么我就没有想法了。

s = ""
SOME_CHUNK_SIZE = 4096 ## 4kb, totally arbitrary
with open("large_file", "rb") as fh:
    if len(s) > SOME_BIG_NUMBER:
        s = s[SOME_CHUNK_SIZE:]
    s += fh.read(SOME_CHUNK_SIZE)
    ## do regex test now

这可能会让你有所收获。您还需要知道何时处于文件末尾,因为它似乎没有引发错误,它只返回 0 个字节。您可以读入一个临时字符串并检查长度,也可以尝试检查文件统计信息并使用SOME_CHUNK_SIZE 进行算术运算。

【讨论】:

  • iter((lambda: file.read(SOME_BIG_NUMBER)), b"") 得到一个可迭代对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 2016-12-02
  • 2019-10-17
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多