gpt4 book ai didi

python - HDFStore:table.select 和 RAM 使用

转载 作者:太空狗 更新时间:2023-10-29 23:59:42 24 4
gpt4 key购买 nike

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

我正在使用 pandas 0-11-dev, python 2.7, linux64

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

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 使用量如此急剧增加。

请注意,该表在创建时已被索引,这样 index=range(nrows(table)) 使用以下代码:

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 的文件。我使用来自 How to trouble-shoot HDFStore Exception: cannot find the correct atom type 的 Zelazny7 代码元素编写了此代码

import pandas as pd
import numpy as np
from sklearn.feature_extraction import DictVectorizer


def object_max_len(x):
if x.dtype != 'object':
return
else:
return len(max(x.fillna(''), key=lambda x: len(str(x))))

def txtfile2dtypes(infile, sep="\t", header=0, chunksize=50000 ):
max_len = pd.read_table(infile,header=header, sep=sep,nrows=5).apply( object_max_len).max()
dtypes0 = pd.read_table(infile,header=header, sep=sep,nrows=5).dtypes

for chunk in pd.read_table(infile,header=header, sep=sep, chunksize=chunksize):
max_len = max((pd.DataFrame(chunk.apply( object_max_len)).max(),max_len))
for i,k in enumerate(zip( dtypes0[:], chunk.dtypes)):
if (k[0] != k[1]) and (k[1] == 'object'):
dtypes0[i] = k[1]
#as of pandas-0.11 nan requires a float64 dtype
dtypes0.values[dtypes0 == np.int64] = np.dtype('float64')
return max_len, dtypes0


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})

应用为

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

最佳答案

这是一个已知问题,请参阅此处的引用资料:https://github.com/pydata/pandas/pull/2755

本质上,查询被转换为一个 numexpr 表达式来进行评估。有一个问题我不能将很多 条件传递给 numexpr (它取决于生成的表达式)。

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

这是我的增强列表:https://github.com/pydata/pandas/issues/2391 (17).

作为解决方法,只需将您的查询拆分为多个查询并连接结果即可。应该快得多,并且使用固定数量的内存

关于python - HDFStore:table.select 和 RAM 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15895837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com