避免pyplot出现Fail to allocate bitmap报错的方法

1. 问题复现

当重复绘图(主要是重复创建figure)之后,即使只是在函数内部的局部变量有定义,或者已经使用
plt.close()关闭绘图,pyplot内依然保留部分内容,但具体是哪一部分暂时没找到。

下面是来自Github的bug复现片段:

import matplotlib.pyplot as plt
import numpy as np
image = np.random.randn(256, 256, 3)
image= np.array(image/image.max()*255, dtype= np.uint8)
for i in range(500):
    print(i)
    plt.cla()
    plt.imshow(image)
    plt.close()

运行之后会在i= 369时出现报错,并且在报错之前内存持续上升。

在这里插入图片描述在这里插入图片描述
内存占用量变化报错截图

2.原因推测

matplotlib所基于的绘图库,可能在绘图时创建了窗口对象,但close()的时候并未释放相关对象,导致内存不断积累。

3.解决方法

定义一个FigureAxes对象,然后重复使用。每次重新绘图之前使用cla()清空之前的绘图内容即可。
例1:

import matplotlib.pyplot as plt
import numpy as np
image = np.random.randn(256, 256, 3)
image= np.array(image/image.max()*255, dtype= np.uint8)
fig, axes= plt.subplots()
for i in range(500):
    print(i)
    axes.cla()
    axes.imshow(image)

例2:

import matplotlib.pyplot as plt
import numpy as np

class __:
    def __init__(self):
        self.fig, self.axes= plt.subplots()

    def imshow(self, x):
        self.axes.cla()
        self.axes.imshow(image)


_= __()
image = np.random.randn(256, 256, 3)
image= np.array(image/image.max()*255, dtype= np.uint8)
for i in range(500):
    print(i)
    _.imshow(image)

版权声明:本文为zxylv原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。