所以,這個一直給我一個很難!
我正在與巨大的文本文件,並由巨大的我的意思是100Gb +。具體來說,他們在fastq format。這種格式用於DNA測序數據,以及由四條線,像這樣記錄:Python - 檢查兩個巨大的文本文件之間的一致性
@REC1
GATTTGGGGTTCAAAGCAGTATCGATCAAATAGTAAATCCATTTGTTCAACTCACAGTTT
+
!''*((((***+))%%%++)(%%%%).1***-+*''))*55CCF>>>>>>CCCCCCC65
@REC2
GATTTGGGGTTCAAAGCAGTATCGATCAAATAGTAAATCCATTTGTTCAACTCACAGTTT
+
!''*((((***+))%%%++)(%%%%).1***-+*''))**55CCF>>>>>>CCCCCCC65
.
.
.
對於這個問題的緣故,只專注於標題行,開始用「@」。
因此,爲了QA的目的,我需要比較兩個這樣的文件。這些文件應該有匹配的標題,所以另一個文件中的第一個記錄也應該有'@ REC1'標題,下一個應該是'@ REC2',依此類推。在進行重大的下游分析之前,我想確保是這種情況。
由於文件太大,天真的迭代一個字符串comparisson會花費很長時間,但是這個QA步驟將運行很多次,我不能等待那麼久。所以我認爲更好的方法是從文件中的幾個點採樣記錄,例如每10%的記錄。如果記錄的順序搞砸了,我很可能會發現它。
到目前爲止,我已經能夠通過估計文件大小來處理這些文件,而不是使用python的file.seek()
來訪問文件中間的記錄。例如,大約訪問線在中間,我會做:
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行,以確保它們是相同的,而不必查看整個文件?
希望任何想法\提示。也許迭代平行?但究竟如何?
謝謝!
我縮進您的文件樣本,以防止因此從格式化粗體/斜體等 - 我希望結果是正確的。請檢查我是否搞砸了一些東西。 –
請求澄清:如果在兩個文件中相同的行號處出現相應的「@ REC123」行,則會考慮兩個文件一致。沒有其他標準? –
@TimPietzcker - 感謝編輯,是的,這是唯一的標準。很簡單... – soungalo