matplotlib:绘图完成后如何释放内存

3
我希望您能告诉我在绘制完图形后释放内存的正确方法,因为当我在一个循环中绘制多个图像时,会出现“RuntimeError:Could not allocate memory for image”错误消息。
目前,我有以下命令可以做到这一点:
import matplotlib.pyplot as plt

# The code
.....

# Make plot
fig = plt.figure()
# Plotting stuff.
plt.imshow(...)
plt.plot(...)
plt.scatter(...)

# Save plot to file.
plt.savefig(...)

# Release memory.
plt.clf()
plt.close()

这个答案中的评论指出,正确的语法实际上是plt.close(fig),但最高票的答案在这里给出plt.clf()已经足够,并没有提到.close
问题是:在图表保存到文件后,什么是正确的命令来释放内存?我需要用.clf.close两个命令还是其中一个就足够了?
1个回答

2

我想为您提供另一种方法。请注意imshow会返回一个处理句柄,获取该句柄的引用,并在后续迭代中使用该对象上的set_data方法。

>>> h = plt.imshow(np.zeros([480, 640]))
>>> h
<matplotlib.image.AxesImage at 0x47a03d0>
>>> for img in my_imgs:
...     h.set_data(img)  #etc

您介意稍微详细解释一下您的答案吗?如果我在绘图中不使用imshow会怎样?set_data调用有什么作用? - Gabriel
你没有展示如何绘制图像,所以 plt.imshow 只是一个猜测。在这种情况下,set_data 将更新 AxesImage 对象的新数据,而不是创建一个新的图像对象,这似乎会给你带来内存问题。 - wim
感谢@wim。我偶尔使用imshow,但不是唯一的选择。我还使用plt.plot()plt.scatter(),所以我不确定如何将其应用于这些情况,我会更新问题以使其更清晰明了。 - Gabriel
对于这些情况,同样的道理,你应该保留 plotscatter 返回的引用,它们也有 set_data 方法,当迭代时可以使用。 - wim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接