【发布时间】:2015-11-18 07:50:28
【问题描述】:
所以,这个让我很难受!
我正在处理 HUGE 文本文件,我的意思是 100Gb+。具体来说,它们位于fastq format 中。此格式用于 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 行以确保它们相同,而无需遍历整个文件?
将不胜感激任何想法\提示。也许并行迭代?但具体如何?
谢谢!
【问题讨论】:
-
我缩进了您的文件示例以防止 SO 将其格式化为粗体/斜体等 - 我希望结果是正确的。请检查我是否搞砸了。
-
请求澄清:如果相应的
@REC123行出现在两个文件中的相同行号,您将认为两个文件一致。没有其他标准? -
@TimPietzcker - 感谢您的编辑,是的,这是唯一的标准。很简单...
-
顺便说一句,要使质量控制成功,不应该允许任何差异,对吧?换句话说,我们想在第一个错误时中止?
-
你又是对的。
标签: python python-2.7 parsing bigdata fastq