我有一个简单的问题,我不禁觉得我错过了一些明显的东西。
我已从源表(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发布所需的峰值内存。
答案 0 :(得分:5)
表格格式的HDFStore是面向行的存储。在行上选择查询索引时,但每行都会获得每列。选择列的子集会在最后执行重新索引。
有几种方法可以解决这个问题:
您选择哪些选项取决于数据访问的性质
注意:您可能不希望将所有列都作为data_columns,除非您真的要从all中进行选择(您只能查询数据_列或索引) 这将使商店/查询更快