Python Numpy和matplotlib垃圾回收
我有一个python脚本,它对不同的参数(Python Numpy和matplotlib垃圾回收,python,numpy,matplotlib,Python,Numpy,Matplotlib,我有一个python脚本,它对不同的参数(Q,K)进行许多模拟,绘制结果并将其存储到磁盘 每组参数(Q,K)生成一个200x200x80数据点的三维体积数据网格,需要约100 MB的数据。然后逐层绘制该体积网格的一部分,生成约60幅图像 问题是python在这个过程中显然不会释放内存。我不确定内存泄漏在哪里,也不确定python决定释放哪些对象的规则是什么。我也不确定是在numpy数组中还是在matplotlib图形对象中丢失了内存 是否有一种简单的方法来分析python中哪些对象保存在内存中,
Q
,K
)进行许多模拟,绘制结果并将其存储到磁盘
每组参数(Q,K
)生成一个200x200x80数据点的三维体积数据网格,需要约100 MB的数据。然后逐层绘制该体积网格的一部分,生成约60幅图像
问题是python在这个过程中显然不会释放内存。我不确定内存泄漏在哪里,也不确定python决定释放哪些对象的规则是什么。我也不确定是在numpy
数组中还是在matplotlib
图形对象中丢失了内存
ctypes
C++/python接口在内的大部分模拟代码被省略,因为它太复杂了):
尝试重复使用您的体形:
plt.figure(0, figsize=(10, 10))
plt.clf() #clears figure
或在保存后关闭您的体形:
...
plt.savefig(...)
plt.close()
问题是,你把所有的数据都保留在周围并公开。如果要使用
pyplot
状态机界面,每次都需要显式关闭图形。否则,它们将保留在周围,以便在您调用plt.show
时显示它们。作为一个快速解决方案,请在plt.savefig
.Ahoj Prokope之后调用plt.close()
,尝试另一种方法,了解如何利用matplotlib>>>[交互式应用程序使用matplotlib;Benjamin V.Root,(2015)
]作为开胃菜,可能喜欢看嵌入式MVC live-matplotlib
-GUI示例>>,了解有关python可用内存分析器的详细信息。顺便说一句,python在释放内存时非常犹豫,将内存返回O/S时就越犹豫。在HPC场景中,分布式进程可以让您在主线程/进程中不受此影响。不过,大多数指示的问题都可以通过实时GUI或使用哑力.clf()
/.close()
方法解决(防止)。啊哈,谢谢,使用plt.close()
似乎不再存在内存泄漏。尽管如此,还是有一些明确的规则以及如何分析这些泄漏是很好的。如果您使用pyplot plt.figure,则不会有泄漏。每次都会给您一个新的数字,并且通过调用plt.figure(n)
仍然可以使用旧的数字,其中n是数字的编号。
...
plt.savefig(...)
plt.close()