Python savefig存图、pickle存模型均为0KB问题排查
问题修复方案
Notebook内绘图能正常显示是因为渲染结果直接输出到前端交互环境,不需要走磁盘写入流程,因此不会暴露路径、缓冲区、后端适配类的问题。你遇到的图片、模型双0KB问题可以按以下优先级排查修复:
1. 优先修复文件名非法字符问题
你当前直接用传入的title拼接生成文件名,是最高发的故障点:
- 循环调用时先打印每次传入的
title实际值,确认不是空值、非字符串类型; - 全量替换文件名里的系统非法字符(
/ \ : * ? " < > |),避免路径解析失败生成空文件:
import re # 清洗为合法文件名 safe_title = re.sub(r'[\\/*?:"<>|]', "_", str(title))
- 不要将文件保存到无写入权限的系统目录,优先保存到当前工作目录,保存前打印完整路径做校验。
2. 修复多进程导致的Matplotlib渲染异常
你代码中GridSearchCV设置了n_jobs=15启动多进程并行计算,Matplotlib默认后端在多进程环境下很容易出现画布未完成渲染就触发写入的问题,最终生成空文件:
- 在所有Matplotlib相关导入的最开头,显式设置非交互式后端:
import matplotlib matplotlib.use('Agg') # 无GUI依赖的非交互后端,适合批量存图场景 import matplotlib.pyplot as plt
- 不要直接调用
plot_confusion_matrix返回对象的figure_引用保存,改成显式调用pyplot接口,保存完成后主动关闭画布避免循环中对象复用冲突,批量跑模型时删掉plt.show()调用(该方法会阻塞进程、干扰缓冲区写入):
plt.clf() plot_confusion_matrix(gbc_cv.best_estimator_, X=x_test, y_true=y_test, labels=gbc_cv.classes_, cmap='Blues') plt.suptitle(title) save_path = f"{safe_title}.png" plt.savefig(save_path, bbox_inches='tight') # 加bbox_inches防止标题、标签被裁切 plt.close('all') # 主动释放画布资源
3. 修复Pickle保存模型为空的问题
该问题和Matplotlib无关,属于文件写入逻辑错误:
- 保存模型必须使用二进制写入模式打开文件,必须通过
with上下文管理器处理文件IO,保证写入完成后自动刷新缓冲区、关闭文件句柄,避免内容停留在内存没写到磁盘:
import pickle # 错误写法(极易生成0KB文件): # f = open("model.pkl", "w") # pickle.dump(gbc_cv.best_estimator_, f) # 正确写法: model_path = f"{safe_title}_model.pkl" with open(model_path, "wb") as f: # 注意模式为wb,即二进制写入 pickle.dump(gbc_cv.best_estimator_, f)
4. 校验逻辑
保存完成后可以打印文件大小做快速校验,确认写入正常:
import os print(f"混淆矩阵保存路径:{save_path},大小:{os.path.getsize(save_path)/1024:.2f}KB") print(f"模型保存路径:{model_path},大小:{os.path.getsize(model_path)/1024:.2f}KB")
如果是在Jupyter环境中运行,批量保存前先重启内核,清除残留的旧画布、变量引用,避免历史状态干扰。
内容的提问来源于stack exchange,提问作者Hnp Mira
相关产品推荐
相关产品推荐

