使用 matplotlib 时,带有 Anaconda 5.1.0 或更高版本的 Jupyter-Notebook 中的内存泄漏

Rez*_*wan 5 python anaconda jupyter-notebook

我将 Jupyter-notebook 与最新的 Anaconda (2018.12) 一起使用,我注意到它使用了大量内存(大约 6GB)进行绘图并将 ~2000 个数字(1920x1080)直接保存到 Ubuntu 18.04 中的 .png 文件中。

我尝试使用 Anaconda 4.4.0 在我的 Mac 中重现该问题,但没有出现问题。

后来我尝试在我的 Ubuntu 机器上安装了几个不同版本的 Anaconda,并用更简单的代码成功重现了内存泄漏问题。

事实证明,Anaconda 5.0.0 是最后一个没有这种特殊内存泄漏问题的版本。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,1,101)
n = 0
dt = 0.01
w = 1

while n <= 1000:
    y = np.sin(2*np.pi*x + w*n*dt)
    plt.clf()
    plt.title("T = %.02f s." %(n*dt))
    plt.plot(x,y)
    plt.savefig("dat/dat_%05d.png" % (n))
    plt.close()
    n = n+1
Run Code Online (Sandbox Code Playgroud)

我正在使用 htop 来监控内存使用情况。

在 Anaconda 5.0.0 中,它显示在我的具有 8GB RAM 的机器中内存使用率为 1.3%。

在 Anaconda 5.1.0 中,内存使用量从 2% 左右开始,并随着将图形保存为 .png 文件而迅速增加,达到内存使用量的 16%,并且即使在单元执行完成后也保持不变。

我试着用

import gc
gc.collect()
Run Code Online (Sandbox Code Playgroud)

并且内存使用量减少了 12%。

当然,通过内存使用,我的意思是仅由那些特定的 python 进程使用内存,而不是整个系统的内存使用。

有人已经在最新的 Anaconda 中包含的 jupyter-notebook 中成功解决了这个内存泄漏问题吗?

cha*_*aig 0

y每个周期重置变量while是不好的形式,因为原始对象仍然在内存中的某个地方,它只是不再有对它的引用。您可以del y在每个 while 循环的末尾、n = n+1语句之前使用它,但这也不会从内存中释放它......它只是停留在 Python 的垃圾收集到达之前。可能添加该行可能会更快地释放内存。

我假设您已经看到了这个: https: //www.quora.com/Why-doesnt-Python-release-the-memory-when-I-delete-a-large-object

由于垃圾收集问题,以较小的块进行绘图创建可能会更快。