python – Pandas – 检索HDF5列和内存使用情况
作者:互联网
我有一个简单的问题,我不禁感到我错过了一些明显的东西.
我已经从源表(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.如果我将特定列解析为读取语句(例如,选择2或3列),则数据帧现在仅返回这些列,但是消耗的内存量相同(24GB).
这是在带有Pandas 0.14的Python 2.7上运行的.
我错过了一些明显的东西吗
编辑:我想我回答了自己的问题.虽然我在发布之前做了很多搜索,但显然一旦发布,我发现了一个有用的链接:https://github.com/pydata/pandas/issues/6379
关于如何优化此过程的任何建议都会很好,因为内存限制我无法达到通过gc释放所需的峰值内存.
解决方法:
表格格式的HDFStore是面向行的存储.在行上选择查询索引时,但每行都会获得每列.选择列的子集会在最后执行重新索引.
有几种方法可以解决这个问题:
>使用列存储,如bcolz;这个目前还没有被PyTables实现,所以这将涉及相当多的工作
> chunk通过表,见here并结束 – 这将使用常量内存
>以固定格式存储 – 这是一种更有效的存储格式,因此将使用更少的内存(但不能追加)
>通过存储到多个子表并使用select_as_multiple创建自己的列存储,请参阅here
您选择哪些选项取决于您的数据访问的性质
注意:您可能不希望将所有列都作为data_columns,除非您真的要从all中进行选择(您只能查询数据_列或索引)
这将使存储/查询更快
标签:python,pandas,h5py,pytables 来源: https://codeday.me/bug/20190609/1207422.html