Alb*_*ert 12 python memory debugging memory-leaks
我正在用Python做一些繁重的计算(使用OpenCV和Numpy),最后,我最终得到了大量的内存使用(> 1GB),所有参考都应该消失,我只有最终结果(不应该超过几MB).
为了调试这个,如果我能以某种方式得到一些统计信息,这将显示我有多少对象实例,它们是什么类型,按它们占用的内存总量(每个对象类)排序,这将是很好的.
或者甚至更好:不是每个对象类,而是每个创建对象的源代码行(我猜这个信息不可用,除非我在Python中激活一些调试会使计算太慢,所以我不确定是否会这样做很有帮助).
我能以某种方式获得这样的统计数据吗?或者我该如何调试?
有些人误解了我:我只需要知道如何调试内存使用情况.处理/运行时间是完美的.
我想你正在寻找一个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,我觉得如果你像你说的那样进行繁重的计算会更合适.
好吧,我把它追了下去.因为没有任何Python内存配置文件提供任何有用的输出(因为他们找不到内存),我很确定一些外部库(OpenCV)是内存泄漏的来源.
我可以用这个简单的代码重现内存泄漏:
import cv
while True: cv.CreateHist([40], cv.CV_HIST_ARRAY, [[0,255]], 1)
Run Code Online (Sandbox Code Playgroud)
Python内存调试的其他一些资源非常有趣(在这种情况下没有帮助,但可能对其他人有用):