You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jupyter Notebook删除变量后内存未释放的问题及排查咨询

解决Jupyter Notebook中内存未释放的问题

遇到这种内存释放的问题确实挺头疼的,尤其是在大型Notebook里不想重启内核丢失进度对吧?我来给你分享几个实用的解决方法,以及如何排查残留的内存对象:

一、无需重启内核的内存回收方法

1. 手动触发Python垃圾回收

Python的自动垃圾回收(GC)有时候会有延迟,尤其是当对象还有隐式引用的时候。你可以手动强制触发回收:

import gc
gc.collect()

不过要注意,这一步生效的前提是没有任何其他引用指向你要删除的对象。如果有其他变量、闭包或者Jupyter内部缓存还持有引用,GC也没法释放内存。

2. 用%xdel替代普通del

Jupyter有自己的变量引用缓存(比如单元格输出、历史记录),普通的del只会删除命名空间中的引用,但Jupyter内部可能还保留着对象的副本。试试用Jupyter的魔法命令%xdel,它会同时清理Jupyter对该对象的内部引用:

%xdel list_of_df

之后再手动触发gc.collect(),内存应该会被释放。

3. 清理Jupyter的输出缓存

有时候你之前打印过list_of_df的内容,Jupyter的输出缓存(_out字典)里还存着这个对象的引用。可以用以下命令清空所有输出缓存:

%reset out

或者如果你知道具体是哪个单元格的输出,直接删除对应条目:

del _out[单元格编号]

二、排查并清理残留的内存对象

在大型Notebook里遗忘了已删除变量的引用?可以用这些方法找到隐藏的内存占用对象:

1. 用pympler库排查大对象

pympler是一个强大的内存分析工具,可以帮你列出所有存活的对象及其内存占用:
首先安装库(如果没装的话):

!pip install pympler

然后运行以下代码查看内存占用概况:

from pympler import muppy, summary

# 获取所有存活对象
all_objects = muppy.get_objects()
# 生成内存占用摘要
memory_summary = summary.summarize(all_objects)
# 打印摘要
summary.print_(memory_summary)

你会看到不同类型对象的数量和内存占比,重点关注大型对象(比如pandas.DataFrame、大列表)。

2. 定位特定类型的残留对象

比如你要找所有未被释放的DataFrame:

import gc
import pandas as pd

# 筛选出所有存活的DataFrame对象
remaining_dfs = [obj for obj in gc.get_objects() if isinstance(obj, pd.DataFrame)]

# 查看每个DataFrame的信息,判断是否是你要删除的那个
for idx, df in enumerate(remaining_dfs):
    print(f"DataFrame {idx}: shape={df.shape}, memory_usage={df.memory_usage(deep=True).sum()/1024/1024:.2f} MB")

3. 查找对象的引用来源

找到可疑对象后,用gc.get_referrers()查看哪些对象还在引用它:

# 以上面找到的某个DataFrame为例
target_df = remaining_dfs[0]
referrers = gc.get_referrers(target_df)

# 打印引用来源(注意会包含一些Jupyter内部对象,需要筛选)
print("Referrers to target DataFrame:")
for ref in referrers:
    # 过滤掉内部模块和函数,重点看命名空间或变量
    if isinstance(ref, dict) and '__name__' in ref:
        print(f"Namespace: {ref.get('__name__')}")
    elif isinstance(ref, list):
        print(f"List containing the object (length: {len(ref)})")

找到引用来源后,手动删除这些引用(比如对应的变量、列表条目),再触发gc.collect()即可释放内存。

小建议

在大型Notebook里,尽量用函数封装代码,减少全局变量的使用——函数内的局部变量在函数执行完毕后会自动被回收,能大大降低内存残留的概率。

内容的提问来源于stack exchange,提问作者user40780

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:05:54