debugging Python:每个对象类型(或源代码行)的内存使用统计信息

wbgh16ku  于 2023-01-26  发布在  Python
关注(0)|答案(2)|浏览(122)

我正在用Python做一些繁重的计算(使用OpenCV和Numpy),最后,我使用了大量的内存(〉1GB),所有的引用都应该消失,我只有最终结果(不应该超过几MB)。
为了调试这一点,如果我能以某种方式获得一些统计信息,显示有多少对象示例是什么类型的,并按它们占用的内存总量排序(每个对象类),那就太好了。
或者更好:不是每个对象类,而是每个创建对象的源代码行(因此,我猜这个信息是不可用的,除非我在Python中激活一些调试,这会使计算太慢,所以我不确定这是否有用)。
我能得到一些像这样的统计数据吗?或者我该如何调试它?
有人误解了我:我只需要知道如何调试内存使用。处理/运行时是完美的。

of1yzvn4

of1yzvn41#

我想你是在找一个Python分析师
你有一堆可以使用的,比如希皮,profile or cprofilePysize ...

使用堆的示例:

你必须在你的代码中的某个地方包含这个片段:

from guppy import hpy
h = hpy()
print h.heap()

它会给予:

Partition of a set of 132527 objects. Total size = 8301532 bytes.
Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
0  35144  27  2140412  26   2140412  26 str
1  38397  29  1309020  16   3449432  42 tuple
2    530   0   739856   9   4189288  50 dict (no owner)

使用cprofile的示例:

你可以这样运行它:

python -m cProfile script.py

输出:

5 function calls in 0.000 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 myscript.py:1(<module>)
        1    0.000    0.000    0.000    0.000 {execfile}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        1    0.000    0.000    0.000    0.000 {range}

你也可以使用gc模块来知道为什么python不释放你的内存,并要求他使用gc.collect()来释放内存。
顺便说一下,你有没有看过numpy,我认为它更适合如果你做繁重的计算,就像你说的。

ioekq8ef

ioekq8ef2#

好了,我找到了它,因为没有一个Python mem配置文件给予任何有用的输出(因为他们找不到内存),我非常确定一些外部库(OpenCV)是mem泄漏的来源。
我可以用下面的代码重现mem漏洞:

import cv
while True: cv.CreateHist([40], cv.CV_HIST_ARRAY, [[0,255]], 1)

Python mem调试的一些其他资源非常有趣(在这种情况下没有帮助,但可能对其他人有用):

相关问题