[英]Slow Regex Search Large Files (bigger than 5GB) Python
Python 新手在这里。 我正在尝试搜索大型文档并提取文本。 我需要的实际数据是括号内的值:xx(bb) xx(bb) xx 可以是任何数字组合,而 bb 是任何包含数字的字符,因此您可以拥有包含 1(YJ) 2(*) 的行。 最终目标是将括号内的字符与集合中的值进行比较:{'hO', 'Ih', 'Dn', '8', 'MF', 'dC', '6', 'RE', 'WM'、'Dh'、'5'}。 所以我会检查 YJ 和 * 是否在集合内
为此,我编写了几个方法来解析这个巨大的文件。 问题是,这需要很长时间。 对于大约 1.5GB 的文件,需要 49 秒。 对于大于 5GB 的文件,搜索需要 5 分钟:
方法 1 有效并打印出该行,但与此处的所有方法一样,它很慢:
with open(filename, 'rb', buffering=102400) as f:
time_data_count = 0
for line in f:
# if b'(X,Y)' in line:
# print(line)
if re.search(b'\d+\(.+\)\s+\d+\(.+\)', line) :
print(line)
方法 2。此方法的另一个问题是它总是不返回任何内容。 为什么?
with open(filename, 'rb') as f:
#text = []
while True:
memcap = f.read(102400)
if not memcap:
break
text = re.search(b'\d+\(.+\)\s+\d+\(.+\)',memcap)
if text is None:
print("none")
方法 3:除非文件小于 1GB,否则仅打印 1 个元素的列表。 为什么是这样?:
with open(filename, 'rb') as f:
time_data_count = 0
text = []
while True:
memcap = f.read(102400)
if not memcap:
break
text = re.findall(b'\d+\(.+\)\s+\d+\(.+\)',memcap)
print(text)
这就是我写的三种方法。 只有 1 可以正常工作。 但他们都有一个慢的问题。 Python 正则表达式一般来说很慢吗? 有没有不同的方法来获得我需要的值类型而不必使用正则表达式? 我认为使用二进制和文件缓冲区会有所帮助,但这与 go 一样快。 请帮忙
如果您使用相同的正则表达式模式进行大量搜索,则应使用re.compile
:
with open(filename, 'rb', buffering=102400) as f:
time_data_count = 0
search_pattern = re.compile(b'\d+\(.+\)\s+\d+\(.+\)')
for line in f:
if search_pattern.search(line):
print(line)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.