所以,这个让我很难受!
我正在处理巨大的文本文件,我的意思是 100Gb+。具体来说,它们采用fastq 格式。这种格式用于 DNA 测序数据,由四行记录组成,如下所示:
@REC1
GATTTGGGGTTCAAAGCAGTATCGATCAAATAGTAAATCCATTTGTTCAACTCACAGTTT
+
!''*((((***+))%%%++)(%%%%).1***-+*''))*55CCF>>>>>>CCCCCCC65
@REC2
GATTTGGGGTTCAAAGCAGTATCGATCAAATAGTAAATCCATTTGTTCAACTCACAGTTT
+
!''*((((***+))%%%++)(%%%%).1***-+*''))**55CCF>>>>>>CCCCCCC65
.
.
.
为了这个问题,只关注标题行,以“@”开头。
因此,出于 QA 的目的,我需要比较两个这样的文件。这些文件应该有匹配的标题,所以另一个文件中的第一条记录也应该有标题'@REC1',下一个应该是'@REC2'等等。在我进行大量下游分析之前,我想确保情况确实如此。
由于文件很大,一个简单的迭代字符串比较会花费很长时间,但是这个 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 行以确保它们相同,而无需遍历整个文件?
将不胜感激任何想法\提示。也许并行迭代?但究竟如何?
谢谢!