使用 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 中存储的大型线串数据集中查找所有道路交叉口

您可以将公式应用于数据透视表的计数过滤器吗?尝试在大型数据集中查找重复项

python使用heapq快速查找最大或最小的 N 个元素