使用Python 3优化去除线条

时间:2018-07-09 18:26:49

标签: python regex python-3.x

我目前正在尝试从大型文本文件中删除大部分行,并将所选信息重写为另一个。我必须逐行阅读原始文件,因为这些行出现的顺序是相关的。到目前为止,我能想到的最好的方法是仅拉相关的行,并使用类似以下内容重写它们:

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使用情况似乎从未超出上限。

2 个答案:

答案 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,这样可以节省一些周期。