子集非常大的文件 - 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 时,您可以对字典进行简单查找以检索所需数据。
我有一个文件 (index1
) 有 17,270,877 个 ID,另一个文件 (read1
) 有这些 ID 的一个子集 (17,211,741)。对于这两个文件,ID 都在每 4 行。
我需要一个新的 (index2
) 文件,它只包含 read1
中的 ID。对于这些 ID 中的每一个,我还需要从 index1
中获取接下来的 3 行。所以我最终会得到 index2
其格式完全匹配 index1
除了它只包含来自 read1
.
我正在尝试实施我读过的方法 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 时,您可以对字典进行简单查找以检索所需数据。