访问SeqIO.index在多进程共享内存中返回dict

时间:2016-07-01 04:55:59

标签: python indexing multiprocessing biopython

我有一个FASTA格式的大文件(40G)。为了加快这个过程,我使用pool.map进行了并行步骤。首先,SeqIO.index用于将大文件的索引信息加载到共享内存(使用多处理管理器)。

但是当我运行以下代码时,程序有时会崩溃(仅跟踪追溯到pool.map),尤其是在运行许多进程时。如果像2个进程一样运行它可能会成功。但是如果我直接将所有数据(不是索引)加载到内存中(取消注释" m_records2")程序总是成功运行。我认为差异来自索引部分。任何建议将不胜感激!

import sys
import os
from Bio import SeqIO
from subprocess import *
from multiprocessing import Pool, Manager

manager = Manager()
m_records = manager.dict()
#m_records2 = manager.dict()
m_kmers=manager.dict()

def do_operation(seq):
    ##do some operations with m_kmers
    return

def run_check(read_id):
    seq=str(m_records[read_id].seq)
    #seq=m_records2[read_id]
    do_operation(seq)

def check_reads(n_threads):
    read_id_list=list(m_records.keys())
    #print read_id_list
    pool = Pool(n_threads)
    m_rslt=pool.map(run_check, read_id_list)
    pool.close()
    pool.join()

if __name__ == "__main__":
    sf_reads=sys.argv[1]
    n_threads=int(sys.argv[2])
    m_records=SeqIO.index(sf_reads, "fasta")
    # for key in m_records:
    #     m_records2[key]=str(m_records[key].seq)
    check_reads(n_threads)

1 个答案:

答案 0 :(得分:0)

我可以使用较小的数据集(来自大肠杆菌的所有蛋白质)重现您的问题,它确实是随机发生的。 似乎问题是在manager.dict()上使用SeqIO.index这是一种不同的类型。

>>> print(type(m_records))
<class 'Bio.File._IndexedSeqFileDict'>

来自documentation

  

索引序列文件并返回类似对象的字典。

来自source code

  

请注意,此伪字典不支持所有方法   一个真正的Python字典,例如,之后未定义values()   这需要立即将所有记录加载到内存中。

如果您使用SeqIO.to_dict,则错误消失,但您可能会耗尽内存。我不知道您的具体任务,但可能将FASTA文件拆分为较小的块并使用完整的字典可能会解决您的问题。