如何在Windows上使用64位Python调试(可能与C库相关的)内存问题?

时间:2011-04-22 22:42:16

标签: python memory-management profiling numpy scipy

我有一个python程序,用Python 2.7,PIL,OpenCV和numpy / scipy处理图像帧。据我所知,它没有维护任何前一帧的列表。然而,随着程序处理越来越多的帧,内存消耗会稳步增加。

有适用于Python的several good discussions内存分析解决方案,但它们似乎专注于32位或Linux解决方案。我应该在Windows上使用64位Python 2.7?初步调查表明问题出在C库中。我对帮助检测C库泄漏或在Python / OpenCV / PIL中发现泄漏的工具特别感兴趣。

3 个答案:

答案 0 :(得分:1)

我发现这里讨论的工具非常有用:http://mg.pov.lt/blog/hunting-python-memleaks.html

他的代码版本here增加了一些测量numpy数组大小。

答案 1 :(得分:1)

我遇到了类似的问题,在一个numpy / scipy重码中追踪严重的内存泄漏,其中没有通常的Python内存管理工具和诊断程序检测到泄漏或暗示其来源。

在我的情况下,泄漏的来源是UMFPACK解算器包的scipy接口代码,它在接口对象构造函数的每次调用时调用C语言初始化例程,但在接口时从不调用去初始化例程对象被破坏,导致临时空间和内部分配以大约15Mb的速率泄漏。在具有10-20k呼叫的应用中,影响很严重。因为内存分配不是通过Python内存管理器完成的,所以像heapy这样的东西无法检测到泄漏。

我不得不使用valgrind +“printf”式调试来追查罪魁祸首。您可能需要查看非python内存使用分析器和检测工具,以找出泄漏的来源。我不在Windows环境中工作,并且不熟悉标准工具链,所以我无法真正建议使用什么。也许其他人可以提出一些建议。

答案 2 :(得分:1)

David Malcom今年在PyCon 2011上做了一个名为Dude, Where's My RAM?的演讲。他讨论了在Python中调试内存使用情况以及展示他为分析内存使用而开发的工具gdb-heap,它可以跟踪内存使用情况,直到单个字节。真的,非常好的谈话。我猜想在Windows上使用gdb-heap很困难(可能在另一个平台上进行测试并可能在那里进行调试很有用?),但是这个谈话涵盖了许多常见问题,解决方案等。