sma*_*ert 5 python hdf5 pytables pandas hdfstore
好吧我正在尝试使用pandas来加载30GB +行和150+列的30GB csv文件到HDFStore.大多数列都是字符串,后跟数字和日期.
我之前从未真正使用过numpy,pandas或pytables,但是在R中使用过数据帧.
我目前只是将大约20000行的样本文件存储到HDFStore中.当我尝试从HDFStore读取表时,表被加载到内存,内存使用量增加了~100MB
f=HDFStore('myfile.h5')
g=f['df']
Run Code Online (Sandbox Code Playgroud)
然后我删除包含DataFrame的变量:
del g
Run Code Online (Sandbox Code Playgroud)
此时内存使用量减少约5MB
如果我再次将数据加载到g中g=f['df'],则内存使用量会再增加100MB
清理仅在我实际关闭窗口时发生.
数据的组织方式,我可能会将数据划分为单个表,最大表大小约为1GB,可以放入内存,然后一次使用一个.但是,如果我无法清除内存,这种方法将无效.
有关如何实现这一目标的任何想法?
回答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)
Run Code Online (Sandbox Code Playgroud)
(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)
Run Code Online (Sandbox Code Playgroud)
(2) 商店从未离开,(3) 我读到,选择一张桌子可能会占用桌子的 3 倍,(4) 商店仍然在那里
最后我还尝试.copy()在 open ( ) 上执行 df操作df = store.select('df')。不要这样做,它会在内存中创建一个怪物,之后无法进行垃圾收集。
最后一个问题 如果内存中的 DF 是 100MB,我知道它在加载时可能会占用内存大小的 2-3 倍,但是为什么在我从 HDFStore 中选择它并关闭存储后它在内存中仍保持在 200MB?
| 归档时间: |
|
| 查看次数: |
5212 次 |
| 最近记录: |