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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 18:36:03