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

Alb*_*ert 12 python memory debugging memory-leaks

我正在用Python做一些繁重的计算(使用OpenCV和Numpy),最后,我最终得到了大量的内存使用(> 1GB),所有参考都应该消失,我只有最终结果(不应该超过几MB).

为了调试这个,如果我能以某种方式得到一些统计信息,这将显示我有多少对象实例,它们是什么类型,按它们占用的内存总量(每个对象类)排序,这将是很好的.

或者甚至更好:不是每个对象类,而是每个创建对象的源代码行(我猜这个信息不可用,除非我在Python中激活一些调试会使计算太慢,所以我不确定是否会这样做很有帮助).

我能以某种方式获得这样的统计数据吗?或者我该如何调试?


有些人误解了我:我需要知道如何调试内存使用情况.处理/运行时间是完美的.

mou*_*uad 9

我想你正在寻找一个python profiler;

你有一堆你可以使用的,比如Heapy,profile或cprofile,Pysize ......

使用Heapy的例子:

您必须在代码中的某处包含此代码段:

from guppy import hpy
h = hpy()
print h.heap()
Run Code Online (Sandbox Code Playgroud)

它会给你输出:

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)
Run Code Online (Sandbox Code Playgroud)

cprofile的示例:

你可以像这样运行它:

python -m cProfile script.py
Run Code Online (Sandbox Code Playgroud)

输出:

         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}
Run Code Online (Sandbox Code Playgroud)

您还可以使用gc模块来了解为什么python不会释放你的内存,并要求他使用gc.collect()释放内存.

顺便说一下你看过numpy,我觉得如果你像你说的那样进行繁重的计算会更合适.

  • 我不太清楚如何从cProfile中获取内存统计信息.你可以解释吗? (4认同)

Alb*_*ert 6

好吧,我把它追了下去.因为没有任何Python内存配置文件提供任何有用的输出(因为他们找不到内存),我很确定一些外部库(OpenCV)是内存泄漏的来源.

我可以用这个简单的代码重现内存泄漏:

import cv
while True: cv.CreateHist([40], cv.CV_HIST_ARRAY, [[0,255]], 1)
Run Code Online (Sandbox Code Playgroud)

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