Как найти последовательность с одинаковым именем в двух очень больших файлах fasta и соединить их пробелом?

У меня есть два очень больших файла fasta, оба размером около 2 ГБ. У них есть некоторые последовательности с одинаковым именем, так что это похоже на:

в R1.фаста:

">ABC001 ACTGTGTCGTG

">ABC003 ACTGTGTCGTG

">ABC005 ACTGTGTCGTG

">ABC010 ACTGTGTCGTG

и в R2.fasta

">ABC002 ACTGTGTCGTG

">ABC003 ACTGTGTCGTG

">ABC005 ACTGTGTCGTG

">ABC009 ACTGTGTCGTG

Я хочу найти общие последовательности между двумя файлами, могу записать в новый файл fasta и соединить две последовательности с зазором, чтобы новый файл выглядел так:

">ABC003 ACTGTGTCGTG-----ACTGTGTCGTG

">ABC005 ACTGTGTCGTG-----ACTGTGTCGTG

Я написал скрипт на Python для выполнения этой работы, но он работал очень медленно. Интересно, есть ли более быстрый способ сделать это. Спасибо! код такой:

from Bio import SeqIO
from Bio.Seq import Seq

R1 = 'L008_R1.forward.trim.fasta' #input R1 file
R2 = 'L008_R2.reverse.trim.fasta' # input R2 file
R  = 'Gap20.L008.R1.fasta' #output joined fasta

n1 = 0
n2 = 0

for rec1 in SeqIO.parse(R1, 'fasta'): #exam every record in R1 file one by one
    n1 = int(rec1.id[5:]) 
    r = rec1 
    for rec2 in SeqIO.parse(R2,'fasta'): 
        n2 = int(rec2.id[5:]) 
        if n1 == n2: 
            seq = rec1.seq+'--------------------'+rec2.seq 
            r.seq = seq 
            output =  open(R, 'aw') # write to a new fasta file
            SeqIO.write(r, output, 'fasta')
            break
        elif n1 < n2: 
    else: pass

person user2341404    schedule 02.05.2013    source источник
comment
Сортируются ли строки в файлах по идентификаторам? Если это так, есть другое решение, которое еще быстрее, чем то, которое я уже опубликовал.   -  person Adrian Panasiuk    schedule 04.05.2013


Ответы (1)


Вы должны использовать dict.

Узким местом в вашем решении является сравнение каждой пары записей из двух файлов на наличие имен.

Лучшее решение — сохранить все записи из первого файла, затем для каждой строки во втором файле узнать, была ли найдена запись с таким же именем в первом файле, и соединить их, если это так.

Диктовка хранит пары данных: «ключ» и «значение»; и позволяет быстро (O(n log n)) вставлять такие пары и выполнять быстрый поиск по ключу. В вашем случае имена записей будут служить ключами, а последовательности — значениями.

Это будет примерно (непроверено) выглядеть так:

# Assuming that record id's are unique within a single file

records = dict()
output = open(R, 'aw')
for record in SeqIO.parse(R1, 'fasta'):
    record_id = int(rec.id[5:])
    records[record_id] = rec1.seq

for record in SeqIO.parse(R2, 'fasta'):
    record_id = int(rec2.id[5:])
    if record_id in records:
        r = records[record_id]
        r.seq = r.seq + '--------------------' + record.seq
    else:
        r = record
    SeqIO.write(r, output, 'fasta')
person Adrian Panasiuk    schedule 02.05.2013