Разбор огромного структурированного файла в python 2.7

Я новичок в мире питонов и биоинформатики. Я имею дело с структурированным файлом почти 50 ГБ, чтобы записать его. Поэтому я хотел бы получить от вас несколько полезных советов.

Файл идет так. (на самом деле это называется FASTQ_format)

@Machinename:~:Team1:atcatg   1st line.
atatgacatgacatgaca            2nd line.       
+                             3rd line.           
asldjfwe!@#$#%$               4th line. 

Эти четыре строки повторяются по порядку. Эти 4 строки похожи на команду. И у меня есть почти 30 кандидатов последовательности ДНК. например atgcat, tttagc

Что я делаю, так это чтобы каждая последовательность ДНК кандидата проходила через огромный файл, чтобы определить, похожа ли последовательность кандидата на последовательность Team dna, что означает допущение одного несоответствия каждому (например, taaaaa знак равно aaaata) и если они похожи или одинаковы, я использую словарь, чтобы сохранить их, чтобы выписать их позже. ключ для последовательности ДНК кандидата. Значение для (4 строки) в списке, чтобы хранить их в порядке очереди

Итак, что я сделал, это:

def myfunction(str1, str2): # to find if they are similar( allowed one mis match) if they are similar, it returns true

    f = open('hugefile')
    diction = {}
    mylist = ['candidate dna sequences1','dna2','dna3','dna4'...]
    while True:
      line = f.readline()
      if not line:
         break
      if "machine name" in line:
         teamseq = line.split(':')[-1]
         if my function(candidate dna, team dna) == True:
             if not candidate dna in diction.keys():
                diction[candidate dna] = []
                diction[candidate dna].append(line)
                diction[candidate dna].append(line)
                diction[candidate dna].append(line)
                diction[candidate dna].append(line)
             else:          # chances some same team dna are repeated.
                diction[candidate dna].append(line)
                diction[candidate dna].append(line)
                diction[candidate dna].append(line)
                diction[candidate dna].append(line)
    f.close()

    wf = open(hughfile+".out", 'w')
    for i in candidate dna list:   # dna 1 , dna2, dna3
          wf.write(diction[i] + '\n')
    wf.close()

Моя функция не использует глобальные переменные (я думаю, что я доволен своей функцией), в то время как переменная словаря является глобальной переменной и принимает все данные, а также создает множество экземпляров списка. Код простой, но такой медленный и такой большой боль в прикладе к процессору и памяти. Я использую Pypy, хотя.

Таким образом, какие-либо советы выписать это в порядке очереди?

1 ответ

Решение

Я предлагаю открывать входные и выходные файлы одновременно и записывать в выходной файл, когда вы проходите через вход. Как сейчас, вы читаете 50 ГБ в память, а затем записываете ее. Это и медленно, и не нужно.

В PSEUDOCODE:

with open(huge file) as fin, open(hughfile+".out", 'w') as fout:
   for line in f:
      if "machine name" in line:
          # read the following 4 lines from fin as a record
          # process that record
          # write the record to fout
          # the input record in no longer needed -- allow to be garbage collected...

Как я обрисовал в общих чертах, предыдущие 4 строчные записи пишутся по мере их появления, а затем удаляются. Если вам нужно обратиться к diction.keys() для предыдущих записей сохраняйте только необходимый минимум set() сократить общий размер данных в памяти.

Другие вопросы по тегам