我正在用Python做一些繁重的计算(使用OpenCV和Numpy),最后,我使用了大量的内存(〉1GB),所有的引用都应该消失,我只有最终结果(不应该超过几MB)。
为了调试这一点,如果我能以某种方式获得一些统计信息,显示有多少对象示例是什么类型的,并按它们占用的内存总量排序(每个对象类),那就太好了。
或者更好:不是每个对象类,而是每个创建对象的源代码行(因此,我猜这个信息是不可用的,除非我在Python中激活一些调试,这会使计算太慢,所以我不确定这是否有用)。
我能得到一些像这样的统计数据吗?或者我该如何调试它?
有人误解了我:我只需要知道如何调试内存使用。处理/运行时是完美的。
2条答案
按热度按时间of1yzvn41#
我想你是在找一个Python分析师
你有一堆可以使用的,比如希皮,profile or cprofile,Pysize ...
使用堆的示例:
你必须在你的代码中的某个地方包含这个片段:
它会给予:
使用cprofile的示例:
你可以这样运行它:
输出:
你也可以使用gc模块来知道为什么python不释放你的内存,并要求他使用gc.collect()来释放内存。
顺便说一下,你有没有看过numpy,我认为它更适合如果你做繁重的计算,就像你说的。
ioekq8ef2#
好了,我找到了它,因为没有一个Python mem配置文件给予任何有用的输出(因为他们找不到内存),我非常确定一些外部库(OpenCV)是mem泄漏的来源。
我可以用下面的代码重现mem漏洞:
Python mem调试的一些其他资源非常有趣(在这种情况下没有帮助,但可能对其他人有用):