我有这个:
files = glob.glob(str(dir_path) + "*.fa")
index = SeqIO.index_db(index_filename, files, "fasta")
seq = index[accession] # Slow
index.close()
return seq
我正在处理大文件(基因序列),但由于某些原因,需要大约4个secondes来获取我正在寻找的序列。我想知道index_db方法是否假设那么慢?我使用正确的方法吗?
感谢。
答案 0 :(得分:1)
第一次创建数据库时,可能需要一些时间。接下来,如果您不删除创建的index_filename
,它应该会更快。
让我们说你有25个文件,每个文件都有一些基因。这种方法创建了一个SQLite数据库,可以帮助定位文件中的序列,比如"让我得到基因XXX"并且SQLite / index_db 知道基因在文件12.fasta
中以及它在文件中的确切位置。因此,Biopython打开文件并快速扫描到基因位置。
如果没有index_db,你必须将每个记录加载到内存中,这很快但有些文件可能不适合RAM。
如果您想要获取区域的速度,可以使用FastaFile from pysam和samtools。像这样:
您必须使用faidx
索引所有fasta文件:
$ samtools faidx big_fasta.fas
从你的代码中写下这样的东西:
from pysam import FastaFile
rec = FastaFile("big_fasta.fas") # big_fasta.fas.fai must exist.
seq = rec.fetch(reference=gene_name, start=1000, end= 1200)
print(s)
在我的电脑中,对于相同的操作,这比Biopython快2个数量级,但是你只能获得纯粹的碱基序列。