如何限制 HDF5 上 Pandas 查询的大小,使其不超过 RAM 限制?

Posted

技术标签:

【中文标题】如何限制 HDF5 上 Pandas 查询的大小,使其不超过 RAM 限制?【英文标题】:How to limit the size of pandas queries on HDF5 so it doesn't go over RAM limit? 【发布时间】:2017-02-20 13:23:36 【问题描述】:

假设我有一个熊猫数据框

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

假设你想限制这个查询的保存,所以对象不是那么大。有没有“熊猫”的方式来做到这一点?

我的问题主要是用熊猫查询 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 应该是你的朋友 在调用store.select(...)时使用chunksize参数怎么样? @Boud 这两个选项都需要考虑。前者呢? @MaxU 可以。如何使用普通的 pandas 数据框实现这一点? 【参考方案1】:

这里有一个小演示,说明在调用HDFStore.select()时如何使用chunksize参数:

for chunk in store.select('df', columns=['column1', 'column2'],
                          where='column1==5', chunksize=10**6):
    # process `chunk` DF

【讨论】:

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

以上是关于如何限制 HDF5 上 Pandas 查询的大小,使其不超过 RAM 限制?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pandas 中将新类别附加到 HDF5?

Pandas系列之入门篇——HDF5

如何链接使用 Pandas 生成的 HDF5 文件?

如何将 Pandas 数据框写入 HDF5 数据集

如何在 R 中将保存在 pandas 中的数据框作为 HDF5 文件加载?

pandas - 如何仅将 DataFrame 的选定列保存到 HDF5