5

好的,我正在尝试使用 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 using g=f['df'],内存使用量会再增加 100MB

只有当我真正关闭窗口时才会进行清理。

数据的组织方式,我可能会将数据分成单个表,最大表大小约为 1GB,可以放入内存中,然后一次使用一个。但是,如果我无法清除内存,这种方法将不起作用。

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

4

1 回答 1

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) 我读到选择一张桌子可能会占用桌子六倍的 3 倍,(4) 商店还在

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

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

于 2015-04-23T09:36:03.710 回答