Python完成脚本后挂起

时间:2016-04-23 10:50:16

标签: python itertools fastq bigdata

我遇到过一种奇怪的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上运行 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

正如@gdlmx所说,关闭文件后可能正在进行python清理。我存在类似的问题,存储为CSV的巨大数据集(每列1e7浮点数)。预计会出现巨大的滞后和非常长的计算时间。

避免这种情况的唯一方法是使用二进制格式,并通过numpy将它们加载到python中。然后,您将需要这些二进制文件的规范。另一种选择是为FASTQ文件编写解析器。

另外,如果你还不知道:BioPython提供了一些模块来解析生物信息学中常见的文件格式,其中包括FASTQ