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 中成功解决了这个内存泄漏问题吗?
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
由于垃圾收集问题,以较小的块进行绘图创建可能会更快。