我在使用Python 3.4(64位Windows)处理一个大约30G的mmap文件时,遇到了正则表达式搜索问题。事实上,在匹配之间,内存占用量会增长到与匹配之间的字节数大致相同,尽管它并没有崩溃,但内存占用量足以减缓其他进程的速度(由于mmapped文件的大小)。
我的正则表达式来自于字节字符串,它非常明确,所有限定符都有界限。在我的表达式中没有星号或加号,因此不会发生可怕的超限制的情况(最坏的情况下,匹配将有2200个字节长,多数命中较小)。我将匹配的字符串存储在一个列表中,但通常只有几千个命中,因此不是所有空间都被命中所占据。
目前我假定正则表达式引擎(sre right?)会在匹配之间保留所有字符串在内存中,在数据集很小时这是可以接受的,但对于我的情况不算理想。所以我的问题是:这种假设是否正确,如果正确,我该如何改变这种行为(最好是不需重新编译库)?
以下是代码:
我的正则表达式来自于字节字符串,它非常明确,所有限定符都有界限。在我的表达式中没有星号或加号,因此不会发生可怕的超限制的情况(最坏的情况下,匹配将有2200个字节长,多数命中较小)。我将匹配的字符串存储在一个列表中,但通常只有几千个命中,因此不是所有空间都被命中所占据。
目前我假定正则表达式引擎(sre right?)会在匹配之间保留所有字符串在内存中,在数据集很小时这是可以接受的,但对于我的情况不算理想。所以我的问题是:这种假设是否正确,如果正确,我该如何改变这种行为(最好是不需重新编译库)?
以下是代码:
pattern = re.compile(b"PATTERN.{1,20}", re.DOTALL)
f = open("file.bin", "rb")
mem = mmap.map(f.fileno(), 0, access=mmap.ACCESS_READ)
results = []
for match in pattern.finditer(mem):
results.append(match.group(0))
f.close()