我的问题很简单,但我无法弄清楚如何解决它。 我有一个大约一百万个序列的列表,每个序列都需要与一个序列适配器对齐。我想用Biopython中的pairwise2工具在python中进行对齐。我想使用这个工具,因为我需要收集所有对齐分数,做一些数学运算并根据数学选择序列。如果我运行下面的代码它可以工作,但它很慢,因为每次只运行一个对齐。
def align_call(record, adapter):
score = pairwise2.align.localms(record.seq, adapter.seq, 1, -3, -1, -0.99, one_alignment_only=1, score_only=1)
print record.id + " " + record.seq + " " + adapter.id + " " + str(score)
#results.append(line)
return
if __name__ == '__main__':
fastaSeq = argv[1]
threads = argv[2]
fastaAdapt = argv[3]
listSeq = []
adpt = list(SeqIO.parse(fastaAdapt, "fasta"))
for record in SeqIO.parse(fastaSeq, "fasta"):
align_call(record, adpt[0])
因此,我正在考虑更改代码并使用多线程或多进程通过基于计算机具有的线程数发送n个并行作业来加速进程。所以我想到了这样的事情:
results = []
def align_call(record, adapter):
score = pairwise2.align.localms(record.seq, adapter.seq, 1, -3, -1, -0.99, one_alignment_only=1, score_only=1)
line = record.id + " " + record.seq + " " + adapter.id + " " + str(score)
results.append(line)
return results
if __name__ == '__main__':
fastaSeq = argv[1]
threads = argv[2]
fastaAdapt = argv[3]
listSeq = []
adpt = list(SeqIO.parse(fastaAdapt, "fasta"))
for record in SeqIO.parse(fastaSeq, "fasta"):
pool = Pool(processes=1)
result = pool.apply_async(align_call, args= (record, adpt[0]))
print result.get()
脚本可以工作,但我不能调制每次需要发送的序列数量,当我得到很多时,我的核心和内存耗尽。
我对如何做到这一点有任何想法?建议? 我试过通过实现Queue但它不起作用
由于 路易
答案 0 :(得分:0)
您可能想要查看vsearch(或usearch) 它非常快!并支持多线程
https://github.com/torognes/vsearch
vsearch --usearch_global big.fasta -db adapter_seq.fasta --uc outputfile.txt --id 0.8 --iddef 0 --threads 6
- id是您允许的目标序列的最大%差异(在这种情况下为80%)
- iddef 0是评分方法0 =基于最短序列的身份,2 =剥离终端间隙......)
然后您可以读取此outputfile.txt并获取对齐分数/匹配/缺口/对齐长度查询名称... 对于每个序列。 通过收集所需的查询名称,您可以使用这些名称从原始的fasta文件中提取相关序列
如果您只是希望大于x%的序列与适配器匹配,则可以使用--matched而不是--uc,这将为您提供在--id上方匹配的序列的fasta文件阈。
或者, - .samout将为您提供一个sam文件,其中包含seq名称,对齐长度,对齐的雪茄代码以及查询序列。
https://github.com/torognes/vsearch/releases/download/v2.7.1/vsearch_manual.pdf具有完整的输出选项和命令
答案 1 :(得分:-1)
我认为应该在SeqIO循环之前创建池。并且您需要使用锁或回调以确保输出顺序正确。