Pandas HDFStore从内存中卸载数据帧

时间:2013-08-13 05:01:15

标签: python pandas hdf5 pytables hdfstore

好的我正在尝试使用pandas来加载30GB +行和150+列的30GB csv文件到HDFStore。大多数列都是字符串,后跟数字和日期。

我以前从未真正使用过numpy,pandas或pytables,但在R中使用过数据帧。

我目前只是将大约20000行的样本文件存储到HDFStore中。当我尝试从HDFStore读取表时,表被加载到内存并且内存使用量增加了~100MB

f=HDFStore('myfile.h5')
g=f['df']

然后我删除包含DataFrame的变量:

del g

此时内存使用量减少约5MB

如果我再次使用g=f['df']将数据加载到g中,则内存使用量会再增加100MB

清理只在我实际关闭窗口时发生。

数据的组织方式,我可能会将数据划分为单个表,最大表大小约为1GB,可以放入内存中,然后一次使用一个。但是,如果我无法清除记忆,这种方法将无效。

关于如何实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:2)

回答OP问题的第二点(“如何释放记忆”)

简短回答

关闭商店并删除所选的数据框不起作用,但是我发现在删除数据帧后,gc.collect()的调用会很好地清除内存。

示例

在下面的示例中,将按预期自动清除内存:

data=numpy.random.rand(10000,1000)         # memory up by 78MB
df=pandas.DataFrame(data)                  # memory up by 1 MB

store = pandas.HDFStore('test.h5')         # memory up by 3 MB
store.append('df', df)                     # memory up by 9 MB (why?!?!)

del data                                   # no change in memory
del df                                     # memory down by 78 MB

store.close()                              # no change in memory
gc.collect()                               # no change in memory (1) 

(1)商店仍在记忆中,虽然已关闭

现在假设我们从上面继续并按以下方式重新打开store。只有在调用 gc.collect()后才能清除内存

store = pandas.HDFStore('test.h5')         # no change in memory (2) 
df = store.select('df')                    # memory up by 158MB ?! (3)
del df                                     # no change in memory
store.close()                              # no change in memory
gc.collect()                               # memory down by 158 MB (4)

(2)商店从未离开,(3)我已经读过,表格的选择偏移量高达表格的六倍,(4)商店仍在那里

最后,我还尝试在开放(.copy())上执行df的df = store.select('df')不要这样做,它会在内存中创建一个不会被垃圾收集的怪物。

最终问题 如果内存中的DF为100MB,我知道它在加载时可能占用内存的2-3倍大小,但是为什么在我从HDFStore中选择并关闭商店后在内存中保持为200MB? / p>