【问题标题】:subsetting very large files - python methods for optimal performance对非常大的文件进行子集化 - 实现最佳性能的 python 方法
【发布时间】:2021-01-22 17:49:47
【问题描述】:

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

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

我正在尝试实现我阅读过的方法here。但我在这两点上绊倒了: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 看起来非常相似,但“+”前后的行不同。

【问题讨论】:

    标签: python performance search subset large-files


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 2015-08-01
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 2019-01-30
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多