python - 对非常大的文件进行子集化 - 实现最佳性能的 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
看起来非常相似,但“+”前后的行不同。
解决方案
如果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 时,您可以在字典上进行简单的查找以检索所需的数据。
推荐阅读
- node.js - nodejs 和 sequelize 迁移收到错误消息
- python - 更新函数返回错误并且不更新数据
- javascript - GraphQL 抽象类型 X 必须在运行时为字段 Y 解析为对象类型
- node.js - Webpack 将 perf_hooks 用于节点/浏览器模块
- variables - 为什么在 while 循环中不使用布尔值?
- spring - Spring Boot - 锁定表中的单个记录直到读写完成
- django - 为什么 django-admin startproject 创建嵌套项目文件夹?
- c# - 将文件添加到 Restsharp Post 请求
- python - 强制停止正在运行 urllib 下载的线程
- c# - Autofac 中的事件处理程序方法注入