如何从内存中删除多个熊猫(python)数据帧以节省 RAM?

Posted

技术标签:

【中文标题】如何从内存中删除多个熊猫(python)数据帧以节省 RAM?【英文标题】:How to delete multiple pandas (python) dataframes from memory to save RAM? 【发布时间】:2015-11-21 17:36:27 【问题描述】:

作为预处理的一部分,我创建了很多数据框。由于我的内存有限 6GB,我想从 RAM 中删除所有不必要的数据帧,以避免在 scikit-learn 中运行 GRIDSEARCHCV 时内存不足。

1) 是否有仅列出当前加载到内存中的所有数据帧的功能?

我尝试了 dir() 但它提供了许多其他对象而不是数据帧。

2) 我创建了一个要删除的数据框列表

del_df=[Gender_dummies,
 capsule_trans,
 col,
 concat_df_list,
 coup_CAPSULE_dummies]

&跑了

for i in del_df:
    del (i)

但它没有删除数据框。但是单独删除数据框 如下是从内存中删除数据帧。

del Gender_dummies
del col

【问题讨论】:

我注意到这个问题还没有公认的答案。我发现here 的答案特别有用,至少在我个人的经验中是这样。从本质上讲,即使 gc.collect() 也不能确保您取回 RAM,但是在不同的进程中运行中间数据帧将确保在进程结束时返回进程占用的资源。该链接还提供了关于如何减少 Pandas 内存使用量的提示。 【参考方案1】:

del 语句不删除实例,它只是删除一个名称。

当您执行del i 时,您只是删除了名称​​i - 但实例仍绑定到其他名称,因此不会被垃圾回收。

如果您想释放内存,您的数据帧必须是垃圾收集,即删除对它们的所有引用。

如果您动态创建日期框以进行列表,则删除该列表将触发垃圾收集。

>>> lst = [pd.DataFrame(), pd.DataFrame(), pd.DataFrame()]
>>> del lst     # memory is released

如果您创建了一些变量,则必须将它们全部删除。

>>> a, b, c = pd.DataFrame(), pd.DataFrame(), pd.DataFrame()
>>> lst = [a, b, c]
>>> del a, b, c # dfs still in list
>>> del lst     # memory release now

【讨论】:

K.如何在python中释放内存? K.为什么“del Gender_dummies 工作”但是当我尝试在循环中删除数据帧时它不起作用? for i in del_df: del (i) 那么,这个解决方案是说为了删除一些数据帧,我们必须先将它们放入一个列表中,然后再删除该列表吗?这听起来太低效了。不知道我是否理解正确。 @Saeed 否。要删除许多也在列表中的数据框,您也必须del 列表。 @JayaKommuru 是的,没错。【参考方案2】:

在 python 中,自动垃圾回收会释放变量(pandas DataFrame 也只是 python 的另一个对象)。可以调整不同的垃圾收集策略(需要大量学习)。

您可以使用手动触发垃圾收集

import gc
gc.collect()

但不鼓励频繁调用垃圾回收,因为这是一项代价高昂的操作并且可能会影响性能。

Reference

【讨论】:

谢谢!如果我已经完成了df.iterrows()del df 之后的自动垃圾收集似乎不会发生,但gc.collect() 似乎有预期的效果。 太棒了,非常有用,尤其是在处理可能耗尽所有内存的大型 Pandas 数据帧时。【参考方案3】:

这将删除数据帧并释放 RAM/内存

del [[df_1,df_2]]
gc.collect()
df_1=pd.DataFrame()
df_2=pd.DataFrame()

数据框将被显式设置为空

在上述陈述中

首先,数据帧的自引用被删除,这意味着在垃圾收集器(gc.collect())收集数据帧的所有引用之后,数据帧不再可供python使用,然后将所有引用显式设置为空数据框。

更多关于垃圾收集器的工作在https://stackify.com/python-garbage-collection/中有很好的解释

【讨论】:

欢迎来到 Stack Overflow!虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性 cmets 挤满你的代码,因为这会降低代码和解释的可读性!

以上是关于如何从内存中删除多个熊猫(python)数据帧以节省 RAM?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法循环多个数据帧以删除相同的列?

如何让熊猫打印出数据而不是内存地址?

如何从多个 API 调用更新熊猫数据框

如何从包含特定列中特定字符串的熊猫数据框中删除行? [复制]

我如何在python中使用for循环制作熊猫数据框对象

从熊猫列中删除列表中的单词 - python 2.7