好的我正在尝试使用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,可以放入内存中,然后一次使用一个。但是,如果我无法清除记忆,这种方法将无效。
关于如何实现这一目标的任何想法?
答案 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>