首页 > 解决方案 > 对非常大的文件进行子集化 - 实现最佳性能的 python 方法

问题描述

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

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

我正在尝试实现我在这里读到的方法。但我在这两点上绊倒了:1)我需要在每 4 行检查一次 ID,但我需要index1(按顺序)所有数据,因为我必须在 ID 后面写下相关的 3 行。2)与那篇关于在大文件中搜索一个字符串的帖子不同,我正在另一个大文件中搜索大量字符串。

有些人可以指出我的方向吗?也许这 5 种方法都不适合这个。我不懂任何信息论;我们有足够的 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看起来非常相似,但“+”前后的行不同。

标签: pythonperformancesearchsubsetlarge-files

解决方案


如果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 时,您可以在字典上进行简单的查找以检索所需的数据。


推荐阅读