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