muppy:获取Python程序中按大小排序的最大PyObject的名称
我的程序有内存泄漏问题。我正在使用pympler库打印程序中最大的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
$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')
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')
newsound
和audio\u data
的两个变量引用。不知何故,当线程完成时,这些零数组并没有被删除