我正在处理人类基因组,在一个患者中有大约1000万个SNP(由“SNP_ID”识别)。我有两个包含行的引用TSV,每行包含一个SNP_ID和一个浮点数(以及许多其他元数据),它都是ASCII码格式的。这些参考TSV的大小为300-500 in。
我需要根据TSV中包含的标准来过滤1000万个SNPs。换句话说,找到包含SNP_ID的行,查找浮点数,并确定该值是否高于阈值。
我的想法是将SNP存储在python集合中,然后对每个TSV进行扫描,查找TSV中的行是否与集合中的任何对象匹配。你认为这是一种合理的方法吗,或者在有1000万个项目的集合中查找时间会非常慢吗?我有成百上千的病人需要做这个,所以应该不会超过一两个小时。
发布于 2019-09-05 09:07:07
您的数据大小足够大,您不应该使用内存中的数据结构。相反,可以考虑使用关系数据库系统。您可以从sqlite开始,它与Python捆绑在一起。
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}
;发布于 2019-09-05 09:50:36
好的,这是我在你的情况下会做的。
SNP_ID制作一个set()是很好的。读取您所有的SNP数据,创建一组SNP_ID,它肯定会放入内存中,然后读取TSV数据,对于每一行,检查SNP_ID是否在您的集合中,如果在,则保存SNP_ID和浮点数,丢弃其余的。您最多将有10M条记录,因为一个SNP只有这么多记录。重新开始您的魔法
为了以防万一,最好把所有的数据都放在一个快速的固态硬盘上。
另外,如果你丢弃元数据,也许你可以将TSV的大小减少到几if,从而节省SNP_ID和浮点数?然后你可以很容易地将它放入内存中,并使事情变得更快。
https://stackoverflow.com/questions/57797101
复制相似问题