muppy:获取Python程序中按大小排序的最大PyObject的名称

muppy:获取Python程序中按大小排序的最大PyObject的名称,python,memory-leaks,Python,Memory Leaks,我的程序有内存泄漏问题。我正在使用pympler库打印程序中最大的pyobject列表,按大小(字节)排序。以下是如何使用它的可复制示例: $pip install pympler import numpy as np from pympler import muppy, summary foo = np.random.normal(size=(1000, 1000)) all_objects = muppy.get_objects() sum1 = summary.summarize(al

我的程序有内存泄漏问题。我正在使用pympler库打印程序中最大的pyobject列表,按大小(字节)排序。以下是如何使用它的可复制示例:

$pip install pympler

import numpy as np
from pympler import muppy, summary

foo = np.random.normal(size=(1000, 1000))
all_objects = muppy.get_objects()
sum1 = summary.summarize(all_objects)
summary.print_(sum1)
所以,我得到了这个结果:

                       types |   # objects |   total size
============================ | =========== | ============
               numpy.ndarray |          42 |      7.63 MB
                         str |       20870 |      3.40 MB
                        dict |        4538 |      2.19 MB
                        list |        4415 |      1.37 MB
                        code |        5882 |    830.05 KB
                        type |         969 |    775.52 KB
                       tuple |        3821 |    278.77 KB
          wrapper_descriptor |        2189 |    188.12 KB
                         set |         148 |    115.53 KB
  builtin_function_or_method |        1442 |    112.66 KB
           method_descriptor |        1406 |    109.84 KB
                     weakref |        1273 |    109.40 KB
                 abc.ABCMeta |          96 |     94.62 KB
                         int |        2769 |     81.01 KB
           getset_descriptor |         974 |     76.09 KB
但这一结果按类型聚合对象。所以,现在我知道一些数组导致了内存泄漏,但我不知道它们中的哪一个是问题的根源。我想得到一个类似的列表,但有明确的名称,比如说,前15个最大的对象

我已经尝试过一个最大的对象:

sorted_objs = muppy.sort(all_objects)
print(sorted_objs[-1])
print(asizeof.asizeof(sorted_objs[-1]))

这实际上以字节为单位打印PyObject和大小。但我也能知道它的名字吗?也就是说,本例中的“foo”。Thx.

我找不到一个解决方案来获取使用这些库的
pympler
/
muppy
返回的最大对象的名称。然而,事实证明,您可以使用
objgraph
获取与内存泄漏故障排除相关的所有信息,包括变量名和对象引用

以下是您可以如何继续的示例:

  • 获取
    objgraph
    ,例如使用pip:

    pip3 install objgraph
    
  • 绘制三个最大对象的参考图

    biggest_vars = muppy.sort(muppy.get_objects())[-3:]
    objgraph.show_backrefs(biggest_vars, filename='backref.png')
    
  • 下面是一个示例,其中内存泄漏是由于在另一个线程中实例化了numpy零数组,并由名为
    newsound
    audio\u data
    的两个变量引用。不知何故,当线程完成时,这些零数组并没有被删除


    我找不到一个解决方案来获取使用这些库的
    pympler
    /
    muppy
    返回的最大对象的名称。然而,事实证明,您可以使用
    objgraph
    获取与内存泄漏故障排除相关的所有信息,包括变量名和对象引用

    以下是您可以如何继续的示例:

  • 获取
    objgraph
    ,例如使用pip:

    pip3 install objgraph
    
  • 绘制三个最大对象的参考图

    biggest_vars = muppy.sort(muppy.get_objects())[-3:]
    objgraph.show_backrefs(biggest_vars, filename='backref.png')
    
  • 下面是一个示例,其中内存泄漏是由于在另一个线程中实例化了numpy零数组,并由名为
    newsound
    audio\u data
    的两个变量引用。不知何故,当线程完成时,这些零数组并没有被删除