Backgroud
最近在处理比对后的bam文件,文件大小约为15G左右,由于内存限制,准备使用生成器的模型分块读取文件,同时进行多进程的处理,大致思路如下:
定义处理函数,使用yield生成器将待处理的数据分块投入到函数内,函数使用python内置多进程multiprocessing进行多核运行,使得运行速度能得到极大的提高。
目前遇到问题,使用函数后,单进程可以正常运行,并可以正常返回结果,但是使用pool进行操作时,函数无返回值,运行程序无结果。
with open(out,'w') as f2:
for region,reads in read_bam(args.infiles,bed):
if (region not in regiondic) or (len(regiondic[region]) <10):continue
reads = [read for read in reads]
if int(args.thread) == 1:
disp("Signle CPU mode")
lines = MarkRead2Bed(reads,region,regiondic[region])
f2.write("\n".join(lines)+"\n")
else:
pool.apply_async(MarkRead2Bed,args=(reads,region,regiondic[region],),callback=lambda x:f2.write("\n".join(x) +"\n"))
pool.close()
pool.join()
上述语句中,只有在args.thread =1的情况下,可以正常输出结果,而在thread >1的时候,没有返回结果。多次测试均无正常输出结果。经过网上检索原因,在一篇文章中提到原因,原因在于python的generator只能在单进程中被消费,无法传递到多进程的函数中。
解决思路:
将generator处理过程去除,使用迭代器迭代读取大文件,进行文件处理。