Pandas HDFStore 从内存中卸载数据帧

Posted

技术标签:

【中文标题】Pandas HDFStore 从内存中卸载数据帧【英文标题】:Pandas HDFStore unload dataframe from memory 【发布时间】:2013-08-14 14:15:22 【问题描述】:

好的,我正在尝试使用 pandas 将大约 30GB 的 csv 文件加载到 HDFStore 中,其中包含 4000 万多行和 150 多列。大多数列是字符串,然后是数字和日期。

我以前从未真正使用过 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,可以放入内存,然后一次使用一个。但是,如果我无法清除内存,这种方法将不起作用。

关于如何实现这一点的任何想法?

【问题讨论】:

你读过这个吗? (显示从 csv 文件中获取数据并按块创建存储的函数,以及日期解析):***.com/questions/16110252/… 您需要关闭商店。有大量使用HDFStorehere的文档 这方面有什么更新吗?我遇到了同样的问题。 f.close() 在我的情况下不会改变内存使用 【参考方案1】:

回答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) 商店还在

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

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

【讨论】:

以上是关于Pandas HDFStore 从内存中卸载数据帧的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pandas 从大型 HDFStore 表中提高查询性能

Pandas HDFStore:当 min_itemsize 设置为字符串列的最大值时追加失败

从python中的.h5文件获取帧时出现Unicode错误

使用 pandas 在 HDF 中存储包含字符串的数据帧时的谜团

通过使用 HDFStore 比较列来选择行

pandas.HDFStore:如何修改现有商店的“data_columns”?我想为不在数据列中的列添加索引