2016-10-04 3 views
0

Я получил это:Является ли метод index_db из объекта SeqIO в Biopython медленным?

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

Правильный метод для чего? Если вы используете только «index_db», чтобы получить одну последовательность, вы не используете ее правильно. – xbello

+0

@xbello Извините, мое плохое. Правильный метод индексирования файлов последовательностей. У меня около 25 файлов, каждый из которых представляет ген, и я должен получить определенное место в последовательности определенного файла. – Thefirefilou

ответ

1

При создании базы данных в первый раз может потребоваться некоторое время. В следующий раз, если вы не удаляете созданный index_filename, он должен идти быстрее.

Допустим, у вас есть 25 файлов с некоторыми генами. Этот метод создает SQLite DB, который помогает находить последовательности между файлами, такие как «Get me the gene XXX», а SQLite/index_db знает, что ген находится в файле 12.fasta и его точном расположении внутри файла. Поэтому Biopython открывает файл и быстро сканирует положение гена.

Без этого index_db вам необходимо загрузить каждую запись в память, которая быстрая, но некоторые файлы могут не вписываться в ОЗУ.


Если вы хотите скорость выборки регионов вы можете использовать FastaFile from pysam и samtools. Как это:

  1. Вы должны индексировать все FASTA файлы с faidx:

    $ samtools faidx big_fasta.fas 
    
  2. из кода написать что-то вроде этого:

    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) 
    

В моем компьютере это на 2 порядка быстрее, чем Biopython для одной и той же операции, но вы получаете только чистую секцию основания баз.

+0

Вот и я. Но, составляет 4 секунды для получения последовательности в индексе, как это: seq = index [accession] # Slow – Thefirefilou

+0

4 секунды не являются и не извлекаются (возможно), а для: 1) создают БД, 2) индексируют его, 3) запросите его. 4) откройте файл fasta. Насколько велики ваши файлы? – xbello

+0

Я посмотрел и выяснил, что выполнение строки «seq = index [accession] # Slow» составляет около 4 секунд. Наверное, открытие fasta должно быть длинным. Файлы варьируются от ~ 15K до ~ 250M. – Thefirefilou