好的,我正在实验熊猫加载一个包含40 million+行和150+列的30 in csv文件到HDFStore。大多数列是字符串,后面跟着数字和日期。
我以前从未真正使用过numpy、熊猫或pytables,但在R中玩过数据帧。
我目前只是将大约20000行的样例文件存储到HDFStore中。当我尝试从HDFStore读取表时,表被加载到内存中,内存使用量增加了~100 by
f=HDFStore('myfile.h5')
g=f['df']然后删除包含DataFrame的变量:
del g此时,内存使用量减少了大约5MB。
如果我再次使用g=f['df']将数据加载到g中,则内存使用量将再增加100 up。
只有当我实际关闭窗口时才会进行清理。
按照数据的组织方式,我可能会将数据划分为单个表,最大表大小在1GB左右,可以放入内存中,然后一次只使用一个表。但是,如果我不能清除内存,这种方法将无法工作。
对我如何做到这一点有什么想法吗?
发布于 2015-04-23 09:36:03
关于OP问题的第二点(“如何释放内存”)的回答
短答案
关闭存储并删除所选的数据call不起作用,但是我发现在删除数据后,对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)我曾读过一张桌子的选择占表的6倍之多,(4)商店还在那里。
最后,我还尝试做了一个.copy()的df (df = store.select('df'))。不允许这样做,它会在内存中创建一个无法在之后被垃圾收集的怪物。
最后一个问题如果内存中的DF是100 an,我知道它在加载时可能占用内存的2-3倍,但是为什么在从HDFStore中选择并关闭存储后,它在内存中保持在200 an?
https://stackoverflow.com/questions/18201042
复制相似问题