【问题标题】:Matplotlib runs out of memoryMatplotlib 内存不足
【发布时间】:2021-07-18 09:00:58
【问题描述】:

这是我用来绘制许多图并保存它们的代码,但它占用了所有可用 RAM 并导致笔记本崩溃。我尝试添加fig.clf()del figgc.collect,但似乎没有任何效果。 我只能保存 38 个数字,然后会话在 Google Colab 上崩溃,因为 RAM 已满。

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

print(np.__version__) # 1.19.5
print(mpl.__version__) # 3.2.2, also tried with latest 3.4.1

x = np.arange(0, 280, 0.1)
y = np.sin(x)

for k in range(100):
  fig, ax = plt.subplots(6, 2, sharex = True)
  fig.set_size_inches(37.33, 21)

  for i in range(2):
    for j in range(6):
      ax[j][i].plot(x, y)

  fig.savefig(f'figure{k}.png', dpi = 300)
  plt.close(fig)

【问题讨论】:

  • 我们无法通过查看伪代码来解决性能问题。提供 MCVE。 stackoverflow.com/help/minimal-reproducible-example
  • 完成,添加了一个 MCVE。
  • 您真的要创建 100 个单独的图像,每个图像包含 12 个图吗?我花了大约 7 秒才生成第一张图像(在 Jupyter 之外完成)。还请在您的示例中添加必要的导入,以及您正在使用的库的版本号。
  • 是的,实际上我想创建 200 个单独的图像,每个图像有 12 个图,每个图包含 2.8k 行数据。但它只能创建 38 个。添加了必要的导入和库的版本号。感谢您的调查。

标签: python-3.x matplotlib jupyter-notebook google-colaboratory


【解决方案1】:

如果您在生成每个图形后尝试保存它,我的意思是尝试将fig. savefig 放入 for 循环中。 编辑:在谷歌上查找问题后,我发现您可能需要购买 Colab pro。

【讨论】:

  • 它已经在最外层的for循环中,在绘制完所有的子图之后。
【解决方案2】:

我建议在循环之外创建 figax,而不是创建 100 个。您可以通过使用plt.cla()ax[j][i].cla() 在每次迭代中清除它来重用相同的ax

x = np.arange(0, 280, 0.1)
y = np.sin(x)

fig, ax = plt.subplots(6, 2, sharex=True)
fig.set_size_inches(37.33, 21)

for k in range(100):
    for i in range(2):
        for j in range(6):
            ax[j][i].cla()
            ax[j][i].plot(x, y)
    
    fig.savefig(f'figure{k}.png', dpi=300)

【讨论】:

  • 我试过了,由于某些原因,第一个情节按照我的意愿很好地创建了,但之后其他情节有填充问题,因为在这里我添加了一个 MCVE,在实际代码中我也有标签、图例和情节标题。在第一个情节之后没有正确放置。
  • 我还尝试使用fig.clf()fig.add_subplot() 仍然存在填充问题。
【解决方案3】:

这与内联后端有关。通过显式切换到 agg 后端可以避免内存泄漏。 交叉引用:matplotlib/issues/20067

【讨论】:

    猜你喜欢
    • 2022-01-04
    • 2011-01-22
    • 2018-02-01
    • 2014-10-15
    • 2011-05-21
    • 2021-12-20
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多