遍历非常大的文件(10+ GB),以查找并删除特定的字母序列。 代码基本上是以下形式:
with open(file1) as r1:
with open(file2) as r2:
for lines in grouper(zip(r1,r2), 4, ''):
r1_seq = lines[1][0].strip()
r2_seq = lines[1][1].strip()
umi = r2_seq[0:11]
umilen = len(umi)
r1_seq_len = len(r1_seq)
while umilen > 0:
errorLimit = umilen // 5
if regex.fullmatch("(?:"+umi+"){s<="+str(errorLimit)+"}",r1_seq[(r1_seq_len-umilen):]) != None:
r1_seq_st = r1_seq[:(0-umilen)]
break
else:
if umilen == 1:
r1_seq_st = r1_seq
break
else:
umi = umi[:-1]
umilen = len(umi)
r1_processed.write(r1_seq_st)
r2_processed.write(r2_seq)
此代码效率很低,因为它需要几个小时。 但是,一种简单的替换方法正在更改:
if regex.fullmatch("(?:"+umi+"){s<="+str(errorLimit)+"}",r1_seq[(r1_seq_len-umilen):]) != None:
收件人:
if r1_seq[(r1_seq_len-umilen):] == umi:
显着加快速度(从50MB文件的4分钟增加到4秒)。 因此,似乎瓶颈在于尝试使用正则表达式而不是简单的比较(不允许替换)来进行替换匹配。
总有没有办法使这种与替换的正则表达式比较有效得多?