如何限制 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 限制?的主要内容,如果未能解决你的问题,请参考以下文章