熊猫 - 检索HDF5列和内存使用情况

时间:2014-09-17 23:50:03

标签: python pandas pytables h5py

我有一个简单的问题,我不禁觉得我错过了一些明显的东西。

我已从源表(SQL Server)读取数据,并创建了一个HDF5文件,用于通过以下方式存储数据:

output.to_hdf('h5name','df',format ='table',data_columns = True,append = True,complib ='blosc',min_itemsize = 10)

数据集大约有5000万行和11列。

如果我将整个HDF5读回数据帧(通过HDFStore.select或read_hdf),它会消耗大约~24GB的RAM。如果我将特定列解析为read语句(例如,选择2或3列),则数据帧现在只返回那些列,但是消耗的内存量相同(24GB)。

这是在带有Pandas 0.14的Python 2.7上运行。

我错过了一些明显的东西吗?

编辑:我想我回答了自己的问题。虽然我在发布之前进行了大量搜索,但显然一旦发布,我发现了一个有用的链接:https://github.com/pydata/pandas/issues/6379

关于如何优化此过程的任何建议都会很棒,因为内存限制我无法达到通过gc发布所需的峰值内存。

1 个答案:

答案 0 :(得分:5)

表格格式的HDFStore是面向行的存储。在行上选择查询索引时,但每行都会获得每列。选择列的子集会在最后执行重新索引。

有几种方法可以解决这个问题:

  • 使用专栏商店,例如bcolz;这个目前没有被PyTables实现,所以这将涉及相当多的工作
  • chunk通过表,见here并在结尾处连续 - 这将使用常量内存
  • 以固定格式存储 - 这是一种更有效的存储格式,因此将使用更少的内存(但无法追加)
  • 通过存储到多个子表并使用select_as_multiple创建自己的列存储,请参阅here

您选择哪些选项取决于数据访问的性质

注意:您可能不希望将所有列都作为data_columns,除非您真的要从all中进行选择(您只能查询数据_列或索引) 这将使商店/查询更快