【问题标题】:Find a pattern in a stream of bytes read in blocks在块中读取的字节流中查找模式
【发布时间】:2022-09-27 16:18:52
【问题描述】:

我有一个千兆字节的数据流,我以 1 MB 的块读取。

我想找出数据中是否(以及在哪里)PATTERNS = [b\"foo\", b\"bar\", ...] 模式之一(不区分大小写)。

这就是我正在做的事情。它有效,但不是最理想的:

oldblock = b\'\'
while True:
    block = data.read(1024*1024)
    if block == b\'\':
        break
    testblock = (oldblock + block).lower()
    for PATTERN in PATTERNS:
        if PATTERN in testblock:
            for l in testblock.split(b\'\\n\'):  # display only the line where the 
                if PATTERN in l:              # pattern is found, not the whole 1MB block!
                    print(l)                  # note: this line can be incomplete if 
    oldblock = block                          # it continues in the next block (**)

为什么我们需要搜索oldblock + block?这是因为模式foo 可能是恰恰分成两个连续的 1 MB 块:

[.......fo] [o........]
block n     block n+1

缺点:连接oldblock + block 并执行几乎双倍的搜索很慢。

我们可以使用testblock = oldblock[-max_len_of_patterns:] + block,但肯定有一个更规范的方法来解决这个问题,以及旁注(**)。

如何在块读取的数据中进行更有效的模式搜索?

    标签: python performance search stream block


    【解决方案1】:
    1. 如果模式匹配,尝试使用“break;” “for”正文中的单词,用于中断已经无用的代码的执行
    2. 并使用 {...} 开始和结束“for”循环体,如:

      为了 (...) { 如果匹配(模式)中断; }

    【讨论】:

    • 谢谢您的回答。关于 1. 即使找到了模式,我仍然想找出模式是否存在于文件的其余部分的其他位置,这是我不break 的方式。关于 2. 我们在 Python 中不使用 { ... } ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2017-04-01
    • 2012-04-15
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    相关资源
    最近更新 更多