如何在 Jupyter Notebook 中释放对象的内存

8
我正在尝试在jupyter笔记本上释放Python对象占用的空间。
具体情况是,我正在处理多个大型数据框,完成计算后,我想加载一个新的数据框。但是这总是导致内存错误,我的系统开始冻结。因此,我想尝试删除Python对象。
到目前为止,我尝试过以下几件事:
1.使用del并调用垃圾回收器。
del pyobject
import gc
gc.collect()
  1. 使用ipython魔术命令

    %reset_selective -f pyobject

这两种方法都无法真正释放内存。查看htop命令可以发现,jupyter笔记本仍在占用我20GB的内存。只有当我重新启动内核时,内存才会被释放(但那样我就会失去我需要用于下一个数据分析阶段的所有其他变量)。


有点跑题,但我的观点是ipython非常适合演示和实验。一旦需要进行严肃的数据处理,就将数据处理导出到Python模块中的常规函数中。 - Mihai Andrei
2个回答

1

确保您的数据不存在其他引用。是否有基于该数组的其他视图?您可以使用get_referrers获取保存对某个对象引用的对象。

如果存在任何视图,您应该将其提升为副本。 特别是,IPython 倾向于在变量 _, _1, _23 等中保留对先前评估的引用。%reset_selective 应该可以清除这些内容。


1
我建议使用%xdel var_name而不是del var_name%reset_selective -f var_name。这样做效果更好,因为它不仅删除变量,还删除了对它的所有(或几乎所有)引用。
根据IPython文档: https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-xdel 命令可以删除一个变量,并尝试从IPython的机制中清除对该变量的引用。默认情况下,它使用用户命名空间中指定对象的标识来删除其他名称下保存的引用。该对象也将从输出历史中删除。
选项: -n:从所有命名空间中删除指定的名称,而不检查它们的标识。
从我尝试了解IPython笔记本中内存释放的工作方式,我了解到del var_name%reset_selective -f var_name只有在你创建一个对象(dataframex)并且从未输出它时,才会释放内存(可以在Windows任务管理器中看到)。如果你通过在下一个单元格中键入df来查看它的样子,或者执行类似df.head()df.values这样的操作来输出它,那么delreset_selective只会删除对该对象的引用,但内存仍然被占用。这是因为IPython将单元格输出存储在变量中,如__1_15(数字表示单元格运行顺序),这些变量显然指向对象,并且不允许释放内存。

所以要真正释放内存,你应该删除存储数据框输出的变量。为此,请调用函数globals(),它返回当前命名空间中的所有变量,找到存储对象输出的变量名称,并使用%xdel删除它,例如%xdel _3。如果您多次输出数据框,则%xdel所有包含这些输出/视图的_变量。

请注意,如果您尝试使用del而不是%xdel删除这些_变量,则无法成功,唯一的选择将是重新启动内核。

import numpy as np
import pandas as pd

big_df = pd.DataFrame(np.random.rand(12_000_000, 15)) # ~1400 megabytes

big_df.head() # outputting dataframe

%xdel big_df 
# would release the memory instantly if outputted whole dataframe (typed 'big_df' 
# instead of 'big_df.head()' in the previous cell)

globals() # looking for variable that stores the output (in our case should be _2)

%xdel _2 
# after deleting output variable(s) the memory should finally be released

# don't use 'del _2'. Memory won't be released and you won't be able 
# to release it without restarting the kernel. (At least I don't know a way)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接