【发布时间】:2015-11-04 22:32:20
【问题描述】:
我在 python 3.4(64 位 Windows)中跨一个大(30-ish GB)mmapped 文件运行正则表达式搜索时遇到“问题”。
基本上,我观察到的是 between 匹配命中,内存占用大致上升到匹配之间的字节数。它实际上并没有崩溃,但占用空间大到足以减慢其他进程的速度(因为映射文件的大小)。
我的正则表达式来自字节字符串,它非常具体,所有量词都是有界的。在我的表达式中没有* 或+,所以这不是一个可怕的超出正则表达式的情况(最坏的情况下匹配将是2200 字节长,大多数命中更小)。我将匹配的字符串存储在一个列表中,但通常最多只有几千个匹配项,因此占用所有空间的不是匹配项。
我目前的假设是正则表达式引擎(sre 对吗?)将所有匹配项之间的字符串保存在内存中,这对于小型数据集很好,但对我来说并非如此。所以我的问题真的是:这个假设是否正确,如果是,我可以改变这种行为(最好不重新编译库!)
代码基本上是这样的:
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()
【问题讨论】:
-
很难说。微软喜欢滥用缓存,所以可能部分文件被windows缓存在内存中。
-
我不确定这是 Windows 的错(或不完全是 Windows 的错)。每次匹配时内存占用量都会下降的行为感觉就像它来自库中......我需要在 unix 风格的盒子上运行这个测试......
标签: python regex python-3.x mmap