内存有效的方法来保持成对的行(字符串匹配)

时间:2016-02-06 02:12:34

标签: python linux bash iteration

我有非常大的文本文件,我需要对其进行排序并删除所有未配对的行。成对的行是在每行开头具有相同32个字符的连续行。我目前有一个用python编写的脚本,带有一个迭代遍历行的while循环,比较行i和(i + 1)的前32个字符,然后只成对输出行。但是,这种方法非常耗费内存并且速度很慢,因为每个文件可能只有几千兆字节。您建议使用更快,更有效的方法吗?作为参考,我正在使用SLURM Linux服务器。

2 个答案:

答案 0 :(得分:1)

只要您不是一次读取整个文件,而是迭代它,它就不应该是内存密集型的。这样的事情应该做:

last = ""
with open("mybibgfile.txt") as f:
    for line in f: 
        if last[:32] == line[:32]
            last = line
            continue
        print(line)
        last = line

答案 1 :(得分:0)

这使用了我最喜欢的两个Python模块itertoolscollections。使用itertools.groupby遍历文件中的行,将具有公共前缀的行组合在一起。使用next()仅从lines迭代器中提取第一个元素,然后使用0长度deque来使用lines迭代器的剩余部分。

from itertools import groupby
from collections import deque
consume = deque(maxlen=0).extend
from operator import itemgetter

prefix_slice = slice(0,32)
with open('bigfile.txt') as infile):
    for _,lines in groupby(infile, key=itemgetter(prefix_slice)):
        print next(lines).rstrip('\n')
        # have to consume iterator over remaining lines before
        # advancing to next groupby key
        consume(lines)

这一次只能在内存中保留一行,加上32个字符的前缀用于与后续行进行比较。 (将折叠所有共享共同的32个字符前缀的连续行,而不仅仅是对。)