子集非常大的文件 - python 方法以获得最佳性能

subsetting very large files - python methods for optimal performance

我有一个文件 (index1) 有 17,270,877 个 ID,另一个文件 (read1) 有这些 ID 的一个子集 (17,211,741)。对于这两个文件,ID 都在每 4 行。

我需要一个新的 (index2) 文件,它只包含 read1 中的 ID。对于这些 ID 中的每一个,我还需要从 index1 中获取接下来的 3 行。所以我最终会得到 index2 其格式完全匹配 index1 除了它只包含来自 read1.

的 ID

我正在尝试实施我读过的方法 here。但我在这两点上遇到了麻烦:1)我需要每 4 行检查一次 ID,但我需要 index1 中的所有数据(按顺序),因为我必须在后面写相关的 3 行ID。 2) 与 post 在一个大文件中搜索一个字符串不同,我在另一个大文件中搜索大量字符串。

有人能给我指明方向吗?也许这 5 种方法中的 none 是最理想的。我不懂任何信息论;我们有足够的 RAM,所以我认为将数据保存在 RAM 中进行搜索是最有效的?我真的不确定。

这里是 index 的示例(ID 以 @M00347 开头):

@M00347:30:000000000-BCWL3:1:1101:15589:1332 1:N:0:0
CCTAAGGTTCGG
+
CDDDDFFFFFCB
@M00347:30:000000000-BCWL3:1:1101:15667:1332 1:N:0:0
CGCCATGCATCC
+
BBCCBBFFFFFF
@M00347:30:000000000-BCWL3:1:1101:15711:1332 1:N:0:0
TTTGGTTCCCGG
+
CDCDECCFFFCB

read1看起来很像,但是'+'前后的行不一样。

如果 index1 的数据可以放入内存,最好的方法是对该文件进行一次扫描并将所有数据存储在字典中,如下所示:

    {"@M00347:30:000000000-BCWL3:1:1101:15589:1332 1:N:0:0":["CCTAAGGTTCGG","+","CDDDDFFFFFCB"],
     "@M00347:30:000000000-BCWL3:1:1101:15667:1332 1:N:0:0":["CGCCATGCATCC","+","BBCCBBFFFFFF"], 
     ..... }

可以根据需要将值存储为格式化字符串。 在此之后,您可以对 read1 进行一次扫描,当遇到 ID 时,您可以对字典进行简单查找以检索所需数据。