Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy和matplotlib垃圾回收_Python_Numpy_Matplotlib - Fatal编程技术网

Python Numpy和matplotlib垃圾回收

Python Numpy和matplotlib垃圾回收,python,numpy,matplotlib,Python,Numpy,Matplotlib,我有一个python脚本,它对不同的参数(Q,K)进行许多模拟,绘制结果并将其存储到磁盘 每组参数(Q,K)生成一个200x200x80数据点的三维体积数据网格,需要约100 MB的数据。然后逐层绘制该体积网格的一部分,生成约60幅图像 问题是python在这个过程中显然不会释放内存。我不确定内存泄漏在哪里,也不确定python决定释放哪些对象的规则是什么。我也不确定是在numpy数组中还是在matplotlib图形对象中丢失了内存 是否有一种简单的方法来分析python中哪些对象保存在内存中,

我有一个python脚本,它对不同的参数(
Q
K
)进行许多模拟,绘制结果并将其存储到磁盘

每组参数(
Q,K
)生成一个200x200x80数据点的三维体积数据网格,需要约100 MB的数据。然后逐层绘制该体积网格的一部分,生成约60幅图像

问题是python在这个过程中显然不会释放内存。我不确定内存泄漏在哪里,也不确定python决定释放哪些对象的规则是什么。我也不确定是在
numpy
数组中还是在
matplotlib
图形对象中丢失了内存

  • 是否有一种简单的方法来分析python中哪些对象保存在内存中,哪些对象被自动释放
  • 是否有方法强制python取消分配在特定循环周期或特定函数调用中创建的所有数组和图形对象
  • 代码的相关部分在这里(但是,它不会运行…包括
    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()