我遇到过一种奇怪的Python行为,这是我以前从未见过的。 我正在运行以下代码:
from __future__ import print_function, division
import itertools
import sys
R1_file = sys.argv[1]
R2_file = sys.argv[2]
out_stats = sys.argv[3]
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return itertools.izip_longest(fillvalue=fillvalue, *args)
print('### Started preparing iterators')
# iterate on reads files and get vector of locations per sequencse
fid1 = open(R1_file)
fid2 = open(R2_file)
gr1 = grouper(fid1,4)
gr2 = grouper(fid2,4)
together = itertools.izip(gr1,gr2)
seq_hash = {}
seq_ind = 0
print('### Started reading fastq')
for blocks in together:
seq_ind += 1
if seq_ind%1000000 == 0:
print('Read in',seq_ind,'reads')
s1 = blocks[0][1]
s2 = blocks[1][1]
conc_seq = s1.strip()+s2.strip()
if conc_seq in seq_hash:
seq_hash[conc_seq].append(seq_ind)
else:
seq_hash[conc_seq] = [seq_ind]
fid1.close()
fid2.close()
# print results to file
print('### Started writing results to file')
with open(out_stats,'w') as fo:
for seq,locations_vec in seq_hash.iteritems():
n = len(locations_vec)
if n > 1:
print(seq,n,':'.join(str(l) for l in locations_vec),sep='\t',file=fo)
print('done writing to file')
print('FINISHED')
此脚本在两个FASTQ文件上运行,这两个文件具有特定格式,查找重复数据并生成一些统计信息。现在,奇怪的是,在脚本运行完毕后,即所有必需的统计数据都会打印到输出文件中并且“完成”'打印到STDOUT,脚本只是讨厌,看起来什么也没做!延迟的持续时间取决于输入文件的大小:当我提供100M输入时,它会挂起几秒钟,当输入为500M文件时,它会挂起大约10分钟,当我运行我的完整数据时 - 〜 130G - 它几乎永远不会结束(我在一夜之间运行它并没有完成)。同样,需要写入输出和STDOUT的所有内容确实已写入。在延迟时间内,cpu使用率很高,并且仍然占用了保存数据所需的内存。我尝试使用pdb进行一些跟踪,看起来脚本在已经打印完成后再次以for blocks in together:
开始运行循环' FINISHED' (虽然我可能会错误地解释pdb输出)
目前我只是在它进入滞后阶段时终止脚本,然后可以毫无问题地使用输出,但这仍然非常烦人。
我使用Python 2.7在Ubuntu上运行
有什么想法吗?
答案 0 :(得分:1)
正如@gdlmx所说,关闭文件后可能正在进行python清理。我存在类似的问题,存储为CSV的巨大数据集(每列1e7浮点数)。预计会出现巨大的滞后和非常长的计算时间。
避免这种情况的唯一方法是使用二进制格式,并通过numpy将它们加载到python中。然后,您将需要这些二进制文件的规范。另一种选择是为FASTQ文件编写解析器。
另外,如果你还不知道:BioPython提供了一些模块来解析生物信息学中常见的文件格式,其中包括FASTQ