回答 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) 我读到选择一张桌子可能会占用桌子六倍的 3 倍,(4) 商店还在
最后,我还尝试在 open ( ).copy()
上执行 df 。不要这样做,它会在内存中创建一个之后无法进行垃圾收集的怪物。df = store.select('df')
最后一个问题
如果内存中的 DF 为 100MB,我知道它在加载时可能会占用 2-3 倍的内存大小,但为什么在我从 HDFStore 中选择它并关闭存储后它会保持200MB 的内存?