Python HDFStore:table.select和RAM用法

Python HDFStore:table.select和RAM用法,python,pandas,pytables,hdfstore,Python,Pandas,Pytables,Hdfstore,我试图从大约1GB的HDFStore表中随机选择行。当我要求大约50个随机行时,RAM的使用量激增 我正在使用pandas0-11-dev、python2.7、linux64 在第一种情况下,RAM的使用符合块的大小 with pd.get_store("train.h5",'r') as train: for chunk in train.select('train',chunksize=50): pass 在第二种情况下,似乎整个表都加载到了RAM中 r=random.choice

我试图从大约1GB的HDFStore表中随机选择行。当我要求大约50个随机行时,RAM的使用量激增

我正在使用pandas
0-11-dev、python2.7、linux64

在第一种情况下,RAM的使用符合
块的大小

with pd.get_store("train.h5",'r') as train:
for chunk in train.select('train',chunksize=50):
    pass
在第二种情况下,似乎整个表都加载到了RAM中

r=random.choice(400000,size=40,replace=False)
train.select('train',pd.Term("index",r))
在最后一种情况下,RAM的使用符合等效的
chunk
大小

r=random.choice(400000,size=30,replace=False)    
train.select('train',pd.Term("index",r))
我很困惑,为什么从30行移动到40行会导致RAM使用量的急剧增加

注意:创建表格时,已使用以下代码对其进行索引,以便索引=范围(nrows(表格)):

def txtfile2hdfstore(infile, storefile, table_name, sep="\t", header=0, chunksize=50000 ):
    max_len, dtypes0 = txtfile2dtypes(infile, sep, header, chunksize)

    with pd.get_store( storefile,'w') as store:
        for i, chunk in enumerate(pd.read_table(infile,header=header,sep=sep,chunksize=chunksize, dtype=dict(dtypes0))):
            chunk.index= range( chunksize*(i), chunksize*(i+1))[:chunk.shape[0]]
            store.append(table_name,chunk, min_itemsize={'values':max_len})
谢谢你的洞察力

编辑以回答Zelazny7

这是我用来将Train.csv写入Train.h5的文件。我是用Zelazny7的代码元素写的

应用为

txtfile2hdfstore('Train.csv','train.h5','train',sep=',')

这是一个已知问题,请参见此处的参考:

本质上,查询被转换为一个
numexpr
表达式进行计算。有一个问题 我无法将许多
条件传递给numexpr(取决于
生成的表达式)

所以我只限制传递给numexpr的表达式。如果超过一定数量的
条件,则查询将作为过滤器而不是内核内选择来完成。基本上这意味着读取表,然后重新编制索引

这是我的增强列表:(17)


作为一种解决方法,只需将查询拆分为多个查询并对结果进行处理。应该快得多,并且使用恒定的内存量

好的,谢谢。我错过了问题线索,我应该先搜索github论坛。顺便说一句,我刚刚意识到你是hdfstore的开发者,所以感谢你的出色工作!这是非常模糊的,不幸的是很容易错过:)您似乎正在以类似于我所希望的方式使用HDFStore。我还并没有时间创建处理大量存储和检索的包装器代码。你介意分享你的
txtfile2dtypes
代码吗?此外,您的数据是否包含大量字符数据?我在使用可变字符数据将csv文件存储到HDFStore时遇到问题。文件大小变大了,因为我必须将
min\u itemsize
设置为如此大的值。我急切地等待着添加
truncate
选项。@Zelazny7我已经用代码更新了线程。事实上,我用的数据和你的一样,卡格尔的推土机。我还没有确定要使用的分类变量
sklearn
。非常感谢!看起来你的文件大小和我的一样。~120mb的文件最终超过1GB。我想知道您或Jeff是否知道,使用
put
存储可变长度
object
列(实际上只是字符串)并将每个文本列保留为自己的HDFStore对象是否更好。我的用例需要更多的实践。在为建模步骤处理字符数据之前,我喜欢探索字符数据。还有其他处理名义数据的方法,例如重新编码到目标均值。只是想给你一个更新。经过多次测试,我确定HDFStore无法正常工作。我正在寻找一种面向列的表结构,不幸的是,HDFStore并不是这样。所以,我加入了R,并将使用ff包。如果你对R持开放态度,它也可能对你有用:干杯
txtfile2hdfstore('Train.csv','train.h5','train',sep=',')