【发布时间】: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