问题描述
我目前正在从事一个生物信息学项目,该项目目前涉及一个对应于大约一千万个唯一键的字典,每个键返回一个分类字符串的子集。
我目前使用解开字典对象,但是我的主要问题是解开需要很长时间。我还需要遍历文件,为每行生成一组键(〜200),查找键,将列表追加到列表列表中,然后将列表展平以生成一个值的计数器对象每行的频率,并且我听说像sql数据库这样的结构将最终消耗加载时间来查找时间。
具有密钥的文件通常包含大约10万行,因此这是我最好的解决方案,但是,即使是在内存,RAM数量和NVME存储增加的更快的PC上,加载数据库所花费的时间也非常长慢。
我想知道什么方向(不同的数据库结构,诸如架子或mashall之类的泡菜替代品,将代码与多进程并行化)将总体上提高我的代码的速度(通过更快的加载时间,更快的查找或两者兼而有之) ?
具体来说:需要创建一个格式键->(DNA子序列):值-> [A,B,C,Y,Z]的数据库,其顺序为1e6 / 1e7条目。
使用该数据库时,将加载该数据库,然后提供查询文件(要查询的1e6 DNA序列),对每个序列中的所有 sub 序列进行查找,请执行以下操作。
对于每个查询:
- 将序列切成子序列。
- 查找每个子序列并返回每个子序列的分类列表
- 使用collections.Counter汇总列表
我想知道如何做:
解决方法
我不确定这里是否有正确的答案,因为存在一些折衷,但是。
有两个选择:
1st。考虑将panads.DataFrame用于数据结构。 它将允许序列化/反序列化为多种格式(我相信CSV应该是最快的,但是可以尝试SQL)。至于查询时间,它应该比复杂查询的命令快得多。
第二。 键值存储区,例如具有map-reduce和其他精美查询功能的MongoDB,在这种情况下,数据始终可用而无需加载时间。