【发布时间】:2019-05-06 11:43:52
【问题描述】:
我正在尝试找到一种快速且节省内存的方法来从类似于此的表格文件中检索特定数据点:
chrom:pos 04a0 7ee8 88ca 477a
chr1:925745 3 1 5 1
chr1:925746 3 1 5 1
chr1:925747 4 1 8 1
chr1:925749 4 1 5 1
在此表中,行名和列名都是唯一的。原始文件的大小为 7GB。它不会改变,因此我也可以将其转换为不同的格式,如果这样可以加快进程。 也许有一种方法可以预先生成索引?
我希望能够通过指定我感兴趣的列和行的名称来检索整数 8,例如使用函数func("chr1:925747", "88ca")。
到目前为止,我已尝试在我的大文件的子集(仅 330 MB)上使用 pandas,检索信息需要 30 秒以上,这对于我的用例来说太慢了。
我的熊猫代码:
import pandas as pd
import sys
inputfile = sys.argv[1]
chrompos = sys.argv[2]
id = sys.argv[3]
data=pd.read_csv(inputfile, sep="\t", index_col=0)
result=data.at[chrompos, id]
print result
可能会使用 sql 表帮助..?我使用“.to_sql”从 pandas 数据框生成了一个 sql 表,但是我的列标题丢失了。
【问题讨论】:
-
你的标题丢失是什么意思?他们会变成什么?
-
只需将您的数据放入数据库中,就像您提到的那样,简单的选择以及 where 子句将使您的结果明显更快
-
@Nullman 当我用
.to_sql转换,然后运行engine.execute("SELECT * FROM test_table").fetchall(),我只会得到[(u'chr1:925745', 3, 1, 5, 1, 2, 3,... -
您是从一开始还是从 data.at 开始计时这 30 秒?如果您要进行多次检索,它们应该只从 data.at 中计时。使用此方法读取 7Gb 数据不起作用
-
@aws_apprentice 也许你是对的,我应该试一试。我太喜欢我的 python 解决方案了,没有考虑先生成一个数据库并测试它有多快。