Итак, это дало мне тяжелое время!
Я работаю с HUGE текстовыми файлами, и огромным я имею в виду 100Gb +. В частности, они находятся в fastq format. Этот формат используется для данных секвенирования ДНК, и состоит из записей четырех линий, что-то вроде этого:Python - Проверка согласованности между двумя огромными текстовыми файлами
@REC1
GATTTGGGGTTCAAAGCAGTATCGATCAAATAGTAAATCCATTTGTTCAACTCACAGTTT
+
!''*((((***+))%%%++)(%%%%).1***-+*''))*55CCF>>>>>>CCCCCCC65
@REC2
GATTTGGGGTTCAAAGCAGTATCGATCAAATAGTAAATCCATTTGTTCAACTCACAGTTT
+
!''*((((***+))%%%++)(%%%%).1***-+*''))**55CCF>>>>>>CCCCCCC65
.
.
.
Ради этого вопроса, просто сосредоточиться на строках заголовков, начиная с «@».
Итак, для целей QA мне нужно сравнить два таких файла. Эти файлы должны иметь соответствующие заголовки, поэтому первая запись в другом файле также должна иметь заголовок '@ REC1', следующий должен быть '@ REC2' и так далее. Я хочу убедиться, что это так, прежде чем я начну анализировать тяжелые анализы.
Поскольку файлы настолько велики, наивная итерация сравнения строк займет очень много времени, но этот шаг QA будет выполняться много раз, и я не могу позволить себе так долго ждать. Поэтому я подумал, что лучший способ - собрать образцы из нескольких точек в файлах, например, каждые 10% записей. Если порядок записей будет испорчен, я бы с большой вероятностью его обнаружил.
До сих пор я мог обрабатывать такие файлы, оценивая размер файла и используя file.seek()
python для доступа к записи в середине файла. Например, чтобы получить доступ к линии примерно в середине, я бы:
file_size = os.stat(fastq_file).st_size
start_point = int(file_size/2)
with open(fastq_file) as f:
f.seek(start_point)
# look for the next beginning of record, never mind how
Но теперь эта проблема является более сложной, так как я не знаю, как координировать между двумя файлами, так как местоположение байтов не является индикатором индекса строки в файле. Другими словами, как я могу получить доступ к 10 567 311 строкам в обоих файлах, чтобы убедиться, что они одинаковые, не обойдя весь файл?
Поблагодарили бы за любые идеи \ hints. Может быть, итерация параллельно? но как именно?
Спасибо!
Я отступом ваш образец файла, чтобы предотвратить SO от форматирования полужирный/курсив и т.д. - Я надеюсь, что результат является правильным. Пожалуйста, проверьте, что я что-то испортил. –
Просьба уточнить: вы согласитесь, что два файла согласуются, если соответствующие строки '@ REC123' встречаются с одинаковым номером строки в обоих файлах. Нет других критериев? –
@TimPietzcker - Спасибо за редактирование, и да, это единственный критерий. Довольно просто ... – soungalo