Ничего себе. Я понял это.
Ответ - использовать модуль подпроцесса python и каналы!
РЕДАКТИРОВАТЬ: забыл упомянуть, что я использую blast2, который поддерживает поддержку трубопроводов.
(это часть класса)
def _query(self):
from subprocess import Popen, PIPE, STDOUT
pipe = Popen([BLAST,
'-p', 'blastn',
'-d', self.database,
'-m', '8'],
stdin=PIPE,
stdout=PIPE)
pipe.stdin.write('%s\n' % self.sequence)
print pipe.communicate()[0]
где self.database - строка, содержащая имя файла базы данных, то есть 'nt.fa'
self.sequence - строка, содержащая последовательность запроса
Это выводит вывод на экран, но вы можете легко его проанализировать. Нет медленного дискового ввода-вывода. Нет медленного разбора XML. Я собираюсь написать модуль для этого и поместить его на github.
Кроме того, я еще не дошел до этого, но я думаю, что вы можете сделать несколько запросов, чтобы не нужно было считывать и загружать базу данных Blast в RAM для каждого запроса.