加快只读字典的python加载时间?

问题描述

我目前正在从事一个生物信息学项目,该项目目前涉及一个对应于大约一千万个唯一键的字典,每个键返回一个分类字符串的子集。

我目前使用解开字典对象,但是我的主要问题是解开需要很长时间。我还需要遍历文件,为每行生成一组键(〜200),查找键,将列表追加到列表列表中,然后将列表展平以生成一个值的计数器对象每行的频率,并且我听说像sql数据库这样的结构将最终消耗加载时间来查找时间。

具有密钥的文件通常包含大约10万行,因此这是我最好的解决方案,但是,即使是在内存,RAM数量和NVME存储增加的更快的PC上,加载数据库所花费的时间也非常长慢。

我想知道什么方向(不同的数据库结构,诸如架子或mashall之类的泡菜替代品,将代码与多进程并行化)将总体上提高我的代码的速度(通过更快的加载时间,更快的查找或两者兼而有之) ?

具体来说:需要创建一个格式键->(DNA子序列):值-> [A,B,C,Y,Z]的数据库,其顺序为1e6 / 1e7条目。

使用该数据库时,将加载该数据库,然后提供查询文件(要查询的1e6 DNA序列),对每个序列中的所有 sub 序列进行查找,请执行以下操作。

对于每个查询

  1. 将序列切成子序列。
  2. 查找每个子序列并返回每个子序列的分类列表
  3. 使用collections.Counter汇总列表

我想知道如何做:

  1. 通过更好的数据结构或某些优化来加快数据库的加载时间
  2. 通常可以提高运行速度(查询子序列)

解决方法

我不确定这里是否有正确的答案,因为存在一些折衷,但是。

有两个选择:

1st。考虑将panads.DataFrame用于数据结构。 它将允许序列化/反序列化为多种格式(我相信CSV应该是最快的,但是可以尝试SQL)。至于查询时间,它应该比复杂查询的命令快得多。

第二。 键值存储区,例如具有map-reduce和其他精美查询功能的MongoDB,在这种情况下,数据始终可用而无需加载时间。