使用 python 在大型数据集中快速查找
Posted
技术标签:
【中文标题】使用 python 在大型数据集中快速查找【英文标题】:Fast lookup in large datasets using python 【发布时间】:2019-09-05 00:42:15 【问题描述】:我正在处理人类基因组,并且在单个患者中拥有约 1000 万个 SNP(由“SNP_ID”标识)。我有两个包含行的参考 TSV,每行包含一个 SNP_ID 和一个浮点数(以及许多其他元数据),它们都是 ASCII 格式。这些参考 TSV 的大小为 300-500GB。
我需要根据 TSV 中包含的标准过滤 1000 万个 SNP。换句话说,找到具有 SNP_ID 的行,查找浮点数并确定该值是否高于阈值。
我的想法是将 SNP 存储在 python 集中,然后对每个 TSV 进行扫描,查找 TSV 中的行是否与集中的任何对象匹配。你认为这是一个合理的方法,还是在有 1000 万个项目的集合中查找时间会很慢?我有数百名患者需要重新处理,因此处理时间不会超过一两个小时。
【问题讨论】:
鉴于字符串非常大,浮点数很小,而且大部分数据都是冗余的,因此 TSV 在放入内存时实际上可能非常小。然后您可以使用pandas
之类的包进行普通连接
【参考方案1】:
您的数据量足够大,您不应该在内存中使用数据结构。相反,请考虑使用关系数据库系统。您可以从与 Python 捆绑在一起的 sqlite 开始。
This SO answer 有关于如何将 TSV 加载到 sqlite 的详细信息。
在您的 SNP 集和参考 TSV 在 sqlite 中后,您可以使用简单的 SQL 查询过滤 SNP,例如:
SELECT
t1.SNP_ID
FROM
snps t1
LEFT JOIN
ref_tsv t2
ON
t1.SNP_ID = t2.SNP_ID
WHERE
t2.value >= your_threshold
;
【讨论】:
【参考方案2】:好的,这就是我在你的情况下会做的事情。
-
500GB 的元数据很多,让我们看看如何减少这个数量。
您用
SNP_ID
制作set()
的想法很好。读取你所有的 SNP 数据,做一组SNP_ID
,它一定能装进内存
然后读取 TSV 数据,为每一行检查 SNP_ID
是否在您的集合中,如果是 - 保存 SNP_ID
和浮点数,丢弃其余部分。您最多会有 1000 万条记录,因为一个 SNP 只有这么多。
施展你的魔法
从下一个 SNP 重新开始
为了以防万一,最好将所有数据放在快速 SSD 上。
而且,还有其他尝试,也许如果您丢弃元数据,您将能够将 TSV 大小减少到几 GB,从而节省 SNP_ID
和浮点数?然后你可以很容易地将它放入内存中,让事情变得更快。
【讨论】:
以上是关于使用 python 在大型数据集中快速查找的主要内容,如果未能解决你的问题,请参考以下文章
如何从 BigQuery 中存储的大型线串数据集中查找所有道路交叉口