用python更快地读取大型fastq文件

时间:2018-02-13 19:01:34

标签: python multithreading multiprocessing fastq

我有几个fastq文件,平均有500.000.000行(125.000.000个序列)。是否有更快的方法来更快地读取这些fastq文件。

我想要做的是读取每个序列并使用前16个序列作为条形码。然后计算每个文件中的条形码数量。

这是我的脚本需要几个小时:

import os, errno
from Bio import SeqIO
import gzip
files = os.listdir(".")
for file in files[:]:
    if not file.endswith(".fastq.gz"):
        files.remove(file)

maps = {}
for file in files:
    print "Now Parsing file %s"%file
    maps[file] = {}
    with gzip.open(file,"r") as handle:
        recs = SeqIO.parse(handle,"fastq")
        for rec in recs:
            tag = str(rec.seq)[0:16]
            if tag not in map[file]:
                maps[file][tag] = 1
            else:
                maps[file][tag] += 1

我有250 GB的RAM和20个可用于多线程的CPU ...

感谢。

1 个答案:

答案 0 :(得分:1)

未经测试,但在这种情况下,您可以通过以下方式实现这一目标:'时尚:

import multiprocessing as mp
import os, errno
from Bio import SeqIO
import gzip

def ImportFile(file):

    maps = {}
    with gzip.open(file,"r") as handle:
        recs = SeqIO.parse(handle,"fastq")
        for rec in recs:
            tag = str(rec.seq)[0:16]
            if tag not in maps.keys():
                maps[tag] = 1
            else:
                maps[tag] += 1

    return {file:maps}


files = os.listdir(".")
for file in files[:]:
    if not file.endswith(".fastq.gz"):
        files.remove(file)

# I'd test this with smaller numbers before using up all 20 cores
pool = mp.Pool(processes=10)
output = pool.map(ImportFile,files)