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

如何从内存中删除多个pandas(python)数据帧以节省RAM?,python,memory-management,pandas,dataframe,ram,Python,Memory Management,Pandas,Dataframe,Ram,作为预处理的一部分,我创建了很多数据帧。因为我限制了6GB的ram,所以我想从ram中删除所有不必要的数据帧,以避免在scikit learn中运行GRIDSEARCHCV时内存不足 1) 是否有只列出当前加载到内存中的所有数据帧的函数 我尝试了dir(),但它提供了很多数据帧以外的其他对象 2) 我创建了一个要删除的数据帧列表 del_df=[Gender_dummies, capsule_trans, col, concat_df_list, coup_CAPSULE_dummies

作为预处理的一部分,我创建了很多数据帧。因为我限制了6GB的ram,所以我想从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
del
语句不删除实例,它只删除名称。 当您执行
deli
时,您只删除了名称i,但实例仍然绑定到其他名称,因此不会被垃圾收集

如果要释放内存,必须对数据帧进行垃圾收集,即删除对它们的所有引用

若您动态地将日期框创建为列表,那个么删除该列表将触发垃圾收集

>>> lst = [pd.DataFrame(), pd.DataFrame(), pd.DataFrame()]
>>> del lst     # memory is released
如果您创建了一些变量,则必须将它们全部删除。
在python中,自动垃圾回收释放变量(DataFrame也只是python中的另一个对象)。可以调整不同的垃圾收集策略(需要大量学习)

您可以使用

import gc
gc.collect()
但不鼓励频繁调用垃圾收集,因为这是一项成本高昂的操作,可能会影响性能


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

del [[df_1,df_2]]
gc.collect()
df_1=pd.DataFrame()
df_2=pd.DataFrame()
数据帧将显式设置为null

在上述声明中

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


关于垃圾收集器工作的更多信息在

K中有很好的解释。如何在python中释放内存?K.为什么“del-Gender_dummies”可以工作?但是当我尝试在循环中删除数据帧时,它不工作?对于del_df:del(i)中的i,这个解决方案是不是说为了删除一些数据帧,我们必须先将它们放在一个列表中,然后删除这个列表?这听起来太没效率了。不确定我是否理解正确。@Saeed否。为了删除列表中的一些数据帧,您也必须
del
列表。@pacholik所以,如果数据帧不在列表中,那么只需
del
该数据帧就可以了?谢谢!如果我做了
df.iterrows()
,那么在
del df
之后自动垃圾收集似乎不会发生,但是
gc.collect()
似乎达到了预期的效果。当然,非常有用,特别是在处理可能耗尽所有内存的大熊猫数据帧时。欢迎使用堆栈溢出!虽然这个代码片段可以解决这个问题,但它确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满您的代码,因为这会降低代码和解释的可读性!我注意到这个问题还没有公认的答案。我发现这个答案特别有用,至少在我个人的经历中是如此。本质上,即使是gc.collect()也不能确保收回RAM,但在不同的进程中运行中间数据帧将确保在进程结束时收回进程占用的资源。该链接还提供了如何减少熊猫内存使用的技巧。
del [[df_1,df_2]]
gc.collect()
df_1=pd.DataFrame()
df_2=pd.DataFrame()