如何限制pandas对HDF5的查询大小,以避免超出RAM限制?

6

假设我有一个pandas数据框(Dataframe)

import pandas as pd

df = pd.DataFrame()

df

   Column1    Column2
0  0.189086 -0.093137
1  0.621479  1.551653
2  1.631438 -1.635403
3  0.473935  1.941249
4  1.904851 -0.195161
5  0.236945 -0.288274
6 -0.473348  0.403882
7  0.953940  1.718043
8 -0.289416  0.790983
9 -0.884789 -1.584088
........

查询的一个示例是 df.query('Column1 > Column2')

假设您想限制此查询的保存,使对象不那么大。有没有“pandas”方法可以实现这一点?

我的问题主要是针对使用pandas查询HDF5对象。 HDF5对象可能比RAM大得多,因此查询可能比RAM大。

# file1.h5 contains only one field_table/key/HDF5 group called 'df'
store = pd.HDFStore('file1.h5')

# the following query could be too large 
df = store.select('df',columns=['column1', 'column2'], where=['column1==5'])

有没有一种pandas/Pythonic的方法来阻止用户执行超过一定大小的查询?

你是想阻止它们因为这会损坏机器吗?还是你想找到一种方法,在不损坏机器的情况下仍然实现它们的计算?如果是后者,dask 应该是你的好朋友。 - Zeugma
在调用 store.select(...) 时使用 chunksize 参数怎么样? - MaxU - stand with Ukraine
@Boud 两个选项都值得考虑。那么前者呢? - ShanZhengYang
@MaxU 这个方法可能可行。如何在普通的pandas dataframe 中实现这个呢? - ShanZhengYang
1个回答

3
这是一个如何在调用HDFStore.select()时使用chunksize参数的小示例:
for chunk in store.select('df', columns=['column1', 'column2'],
                          where='column1==5', chunksize=10**6):
    # process `chunk` DF

这并没有完全回答我的问题,但这是一种方法。如果我将PyTables集成到软件中,使用户查询“HDFStore”,我希望查询会一直进行,直到遇到“太多行”的情况---然后,它将停止并抛出一个错误。如果我预先知道查询太大并想要分解它,那么上面的解决方案就可以使用。我是否清楚地解释了问题? - ShanZhengYang
@ShanZhengYang,我还是不太清楚...你想在从存储中读取DF之前估计其大小吗? - MaxU - stand with Ukraine
不一定,但我怀疑这是最好的方法。假设我尝试 df = store.select('df',columns=['column1', 'column2'], where=['column1==5']),并且它在RAM方面比某个限制要大 - 如果限制是计算机硬件设置的限制,程序将会冻结。假设我想设置一个任意的限制,例如4 GB。HDF5可能是+TB或PB,因此如果用户查询此对象,则df很容易超过RAM。我可以采取什么限制措施来防止发生“坏事”? - ShanZhengYang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接