首页 > 解决方案 > 运行多处理 kmer 计数脚本时遇到问题

问题描述

您好,我想在基因组中查找单词/kmers/ngram。我正好有 198000 个文件,每个文件都包含一个长度为 N 的基因组。我有一些代码,例如:

def count_kmers(sequence, alphabet, k, base_filter=False):
    seq, alphabet = sequence.upper(), set(alphabet.upper())
    seq_len = len(seq)
    count = Counter(seq[i:i+k] for i in range(0, seq_len - k +1))
    if base_filter:
        return dict((key,value) for key, value in
                    count.items() if set(key).issubset(alphabet))
    return count

def kmer_positions(sequence, alphabet, k):
    """ returns the position of all k-mers in sequence as a dictionary"""
    mer_position = defaultdict(list)
    for i in range(1,len(sequence) - k + 1):
        kmer = sequence[i:i+k]
        if all(base in set(alphabet) for base in kmer):
            mer_position[kmer] = mer_position.get(kmer,[]) + [i]
    # combine kmers with their reverse complements
    pair_position = defaultdict(list)
    for kmer, pos in mer_position.items():
        krev = get_reverse_complement(kmer)
        if kmer < krev:
            pair_position[kmer] = sorted(pos + mer_position.get(krev, []))
        elif krev < kmer:
            pair_position[krev] = sorted(mer_position.get(krev, []) + pos)
        else:
            pair_position[kmer] = pos
    return pair_position

还有其他,但 kmer_positions(sequence, alphabet, k) 函数至少需要 2 分 42 秒才能完成一个长度为 6407042 的基因组。我尝试了多处理的 count_kmers,它从 1.3 秒到 97.3 微秒。

我正在使用这样的多处理:

args = [alphabet='ACGT', k=6]
f = partial(kmer_positions, genome)
pool =  multiprocessing.Pool(4)
r = pool.apply_async(f, args) # use apply_async that was the one who works to my arguments
r.get().keys()

我试图找到一个好的材料来学习,但仍然不满意。有什么帮助可以更好地使用这个工具吗?

谢谢 PS - 我知道有很多专门用于此任务的工具,如 khmer、kat 等……但我正在学习 python,我想尽可能地学习这门语言

标签: pythonpython-multiprocessing

解决方案


推荐阅读