matplotlib循环迭代时报"fail to allocate bitmap"崩溃,常规清理方案无效如何解决?
问题根本原因
你遇到的Fail to allocate bitmap错误属于matplotlib的资源泄漏问题:
pyplot是为交互式场景设计的状态机接口,高频循环中反复调用plt.imshow会持续创建AxesImage对象与GUI相关的位图资源,即便调用plt.close('all'),也会因为内部缓存持有引用、垃圾回收不及时,导致GDI位图资源占用触及Windows系统单进程上限(你遇到的368次就是典型的阈值表现),最终触发分配失败。
解决方案
优先推荐复用Figure/Axes对象的写法,完全避免高频创建销毁资源,性能最优也不会出现泄漏:
import matplotlib.pyplot as plt import cv2 compteur = 0 # cv2默认读取为BGR格式,先转成matplotlib适配的RGB格式(不影响崩溃问题,仅解决显示颜色错误) image = cv2.cvtColor(cv2.imread(r"D:\OneDrive\Bureau\New folder\12345.jpg"), cv2.COLOR_BGR2RGB) # 循环外提前创建好复用的画布与绘图对象 fig, ax = plt.subplots() im_obj = ax.imshow(image) while True: print('1') # 仅更新图像数据,不新建任何对象 im_obj.set_data(image) # 如果需要实际渲染画布再加入下行,否则可以省略 # fig.canvas.draw() print('2') print(f'\n{compteur}:\t') compteur += 1
如果你必须保持每次循环新建/销毁的逻辑,可通过切换非交互式后端+手动清除引用解决:
import matplotlib.pyplot as plt import cv2 import gc # 切换到无GUI的Agg后端,避免占用GUI位图资源 plt.switch_backend('Agg') compteur = 0 image = cv2.cvtColor(cv2.imread(r"D:\OneDrive\Bureau\New folder\12345.jpg"), cv2.COLOR_BGR2RGB) while True: print('1') ax_user = plt.imshow(image) print('2') plt.close('all') # 手动删除imshow返回对象的引用 del ax_user # 强制触发垃圾回收 gc.collect() print(f'\n{compteur}:\t') compteur += 1
注意事项
- 不要在高频循环场景使用pyplot的隐式创建接口(
plt.imshow/plt.plot等),这类接口设计目标是交互式调试,不适合高性能循环场景 - 所有matplotlib绘图资源尽量复用,避免不必要的创建销毁操作
内容的提问来源于stack exchange,提问作者Magooz
相关产品推荐
相关产品推荐

