我目前正在尝试从大型文本文件中删除大部分行,并将所选信息重写为另一个。我必须逐行阅读原始文件,因为这些行出现的顺序是相关的。到目前为止,我能想到的最好的方法是仅拉相关的行,并使用类似以下内容重写它们:
SELECT E.*, SR1.EVENT_ID, SR2.EVENT_ID
FROM Events E
LEFT OUTER JOIN strings_ref sr1 on E.EVENT_ID=SR1.EVENT_ID AND sr1.string_id = 123
LEFT OUTER JOIN strings_ref sr2 on E.EVENT_ID=SR2.EVENT_ID AND sr2.string_id = 456
WHERE SR1.EVENT_ID IS NOT NULL OR SR2.EVENT_ID IS NOT NULL
但是,此程序仍然需要花费约8个小时才能运行,包含〜1Gb文件和〜120,000条匹配的行。我认为瓶颈可能涉及正则表达式或输出位,因为完成此脚本所花费的时间与行匹配数成线性比例。
我曾尝试先将输出数据存储在内存中,然后再将其写入新的文本文件,但是一项快速测试表明,其存储数据的速度与之前写入数据的速度大致相同。
如果有帮助,我有Ryzen 5 1500和8Gb的2133 Mhz RAM。但是,我的RAM使用情况似乎从未超出上限。
答案 0 :(得分:3)
您可以将内部循环移动到仅在需要时运行。现在,您正在为大文件中的每一行循环data
,但匹配时仅使用stuff
变量。因此,只需将for stuff in data:
循环移动到实际使用它的if
块内部即可。
for line in input_file:
# Search the line
line_data = re.search(r"(match group a)|(match group b)", line)
# Verify there is indeed a match to avoid raising an exception.
# I found using try/except was negligibly slower here
if line_data:
for stuff in data:
if line_data.group(1):
output_file.write('\n')
elif line_data.group(2) == stuff:
output_file.write('stuff')
答案 1 :(得分:0)
您要为每行生成正则表达式而消耗大量CPU,因此应在搜索开始时compile the regex,这样可以节省一些周期。