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

VS Code中Python3.7运行matplotlib循环绘图报线程与内存错误

问题根因分析

你遇到的两类报错本质都来自matplotlib批量绘图时的内存泄漏:

  • 非调试模式下内存持续占用直到触达32位Python的2GB寻址上限,直接触发MemoryError
  • 调试模式下debugpy需要额外创建线程做代码跟踪,内存耗尽后系统无法为新线程分配资源,才会抛出RuntimeError: can't start new thread,和VS Code后台进程无关。

你提供的测试代码存在两个明显的资源释放问题:

  1. 没有指定matplotlib后端,默认调用带GUI交互的后端,批量绘图时会残留大量GUI相关的缓存资源
  2. 混用了全局plt操作和fig对象操作,plt.close()未指定关闭对象时只会清理当前活动画布,导致大部分旧画布资源没有被释放,多次重复调用clear()/clf()没有实际作用

修复方案

1. 切换非交互后端(必改)

批量绘图不需要GUI渲染,在导入pyplot之前强制指定非交互后端Agg,可以避免大部分不必要的缓存开销:

import matplotlib
matplotlib.use('Agg') # 该行必须放在import matplotlib.pyplot之前
import matplotlib.pyplot as plt
import gc # 可选,用于主动触发垃圾回收

2. 简化清理逻辑

去掉冗余的clear操作,每次循环结束后明确关闭当前画布并删除引用:

door = 0
while True:
    door += 1
    # 不需要指定num、clear参数,每次生成全新画布即可
    fig, ax = plt.subplots(3, 1, sharex='all', figsize=(11.25, 6))
    print(door)
    # 此处插入你的绘图、保存逻辑

    # 清理步骤
    plt.close(fig) # 明确指定要关闭的画布对象
    del fig, ax
    gc.collect() # 可选,内存上涨明显时加上主动回收

3. 可选优化

你当前使用的是32位Python3.7,32位程序的最大内存寻址上限为2GB,是你运行到250次就崩溃的直接原因,有条件可更换为64位Python,可支持更高的内存占用上限。


排查监控指标

  • 非调试模式:监控Python进程的私有内存占用,修复后内存应稳定在固定区间,不会随循环次数持续上涨
  • 调试模式:除内存外额外监控Python进程的线程数,正常运行时线程数应稳定在个位数,不会持续增长

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:57:01