我正在尝试global alignment模块中的Biopython方法。在短序列上使用它很容易,并且可以直接给出比对矩阵。但是我确实需要在我拥有的更大序列上运行它(平均长度为2000 nucleatides (or) characters)。但是我一直遇到Out of Memory错误。我查看了SO,发现this上一个问题。提供的答案没有帮助,因为它们链接到现在无法访问的this同一个网站。除此之外,我还尝试了以下步骤:


由于我的个人计算机具有64-bit RAM,因此我尝试使用4gb python。
ssh安装到具有16gb RAM的小型学校服务器,并尝试在该服务器上运行。在将近4个小时后,它仍在运行。


由于它是一个小的脚本,因此不确定如何修改它。任何帮助将不胜感激。

我的剧本:

import os
from Bio import pairwise2
from Bio.pairwise2 import format_alignment

file_list = []

file_list = [each for each in os.listdir(os.getcwd()) if each.endswith(".dna")]

align_file = open("seq_align.aln","w")

seq_list = []

for each_file in file_list:
    f_o = open(each_file,"r")
    seq_list.append(f_o.read())

for a in pairwise2.align.globalmx(seq_list[0],seq_list[1]):
    align_file.write(format_alignment(*a))

align_file.close()

最佳答案

因此,学校服务器最终完成了任务。我意识到,每次比对都会构建和计算1000个矩阵。 align.globalxx方法具有变量MAX_ALIGNMENT,默认情况下将其设置为1000。通过monkey patching dint更改它确实可以更改任何内容。文档说,该方法尝试所有可能的比对(是1000),但在我的情况下,所有矩阵都具有相同的比对分数(以及我尝试过的测试序列很少)。最后,文档中的一小段评论指出,如果您只需要1分,请使用可选参数one_alignment_only,该参数仅接受boolean值。我所做的就是:

for a in pairwise2.align.globalmx(seq_list[0],seq_list[1],one_alignment_only=True):
    align_file.write(format_alignment(*a))


这大大减少了时间。但是我的PC仍然崩溃,因此我认为这是一个非常占用内存的任务,需要更多的RAM(在小型服务器上为16gb)。因此,应该考虑一种更有效的读取矩阵序列的方法。

关于python - Biopython全局比对:内存不足,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26320409/

10-11 23:12