Pandas HDFStore从内存中卸载数据帧



好的,我正在尝试用panda将大约一个30GB的csv文件加载到HDFStore中,该文件包含4000多万行和150多列。大多数列都是字符串,后面跟着数字和日期。

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

我目前正在HDFStore中存储一个大约20000行的示例文件。当我尝试从HDFStore读取该表时,该表被加载到内存中,内存使用量增加了约100MB

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

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

del g

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

如果我再次使用g=f['df']将数据加载到g中,则内存使用量会激增另一个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) 

(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)商店仍然在

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

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

最新更新