根本原因是Jupyter需一次性解析大JSON文件,因outputs含大量图片、表格等导致内存溢出;解决需删输出、清缓存或拆结构,推荐用jupyter nbconvert清除输出或手动编辑JSON精准删除。

ipynb 文件过大打不开,根本原因不是硬盘空间或网络问题,而是 Jupyter 内核在加载时需一次性解析整个 JSON 结构——当 outputs 里塞了大量图片、表格、日志或大数组(比如 np.random.rand(10000, 10000)),文件体积轻松突破 100MB,浏览器直接卡死或报 Out of memory。
这类问题无法靠“重启内核”或“换电脑”解决,必须从文件本体下手:删输出、清缓存、拆结构。
用 jupyter nbconvert 快速清除所有输出
这是最稳、最通用的方案,不依赖 Notebook 是否能打开,纯命令行操作。
- 在终端(非 Notebook 单元格)中执行:
jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace your_notebook.ipynb -
--inplace表示原地修改,不生成新文件;若想保留原文件,去掉该参数并加--output clean_notebook.ipynb - 注意:该命令会清空所有单元格的
outputs和execution_count,但代码和 Markdown 内容完全保留 - 如果提示
Command not found,说明没装 nbconvert 或不在环境路径里,先运行pip install jupyter(它自带 nbconvert)
手动编辑 .ipynb JSON 文件删特定输出
当只有个别单元格输出爆炸(比如一个 plt.show() 生成了 500 张图),而你又不想清空全部输出时,这招更精准。
- 用 VS Code、Notepad++ 或任意纯文本编辑器打开
your_notebook.ipynb - 搜索
"outputs": [,定位到对应单元格的outputs字段 - 把整个
outputs数组内容(从[到匹配的])替换成空数组:"outputs": [] - 务必检查 JSON 格式是否合法:删完后可用 jsonlint.com 粘贴验证,避免逗号遗漏或括号不匹配导致文件损坏
用 Python 脚本选择性清理大输出项
适合批量处理多个 notebook,或按条件过滤(例如只清空含 PNG 图片且 size > 1MB 的 output)。
- 核心逻辑是读取 JSON → 遍历
cells→ 判断outputs类型和大小 → 删除或截断 - 示例片段(保存为
clean_outputs.py后运行):
import json
with open('big_notebook.ipynb', 'r', encoding='utf-8') as f:
nb = json.load(f)
<p>for cell in nb['cells']:
if 'outputs' in cell:</p><h1>只清空含 image/png 且 data 太长的输出</h1><pre class='brush:python;toolbar:false;'> for out in cell['outputs']:
if out.get('output_type') == 'display_data' and \
'image/png' in out.get('data', {}):
data = out['data']['image/png']
if len(data) > 1_000_000: # 超过 1MB base64
out['data']['image.png'] = ''with open('cleaned.ipynb', 'w', encoding='utf-8') as f: json.dump(nb, f, indent=2)
- 注意:
image/png是 base64 编码字符串,长度判断比文件体积更直接;实际使用前建议先备份原文件 - 别直接删整个
outputs列表,否则可能丢失error类型输出,影响调试
真正麻烦的不是“怎么删”,而是删完之后——有些 notebook 依赖输出结果做后续计算(比如上一个 cell 把模型预测结果 print 出来,下一个 cell 手动 copy-paste 成变量)。这种隐式依赖一旦被清空,就断链了。动手前最好确认:这个 notebook 是用于归档分享,还是仍需迭代执行?前者可放心清空,后者建议用 %store 或显式变量保存关键中间态,而不是靠 output“截图”传值。


















