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

3 投票
3 回答
701 浏览
提问于 2025-04-16 16:16

我有一个用Python 2.7编写的程序,它处理图像帧,使用了PIL、OpenCV和numpy/scipy。根据我所知,这个程序并没有保存之前帧的列表。但是,随着程序处理的帧越来越多,内存使用量却在不断增加。

关于Python的内存分析,有一些不错的讨论,链接在这里:几篇 好的 讨论。不过,这些讨论似乎主要集中在32位或Linux的解决方案上。我应该在Windows上使用什么工具来配合64位的Python 2.7呢?初步调查显示,问题可能出在某个C语言库上。我特别想找到一些工具,帮助我检测C语言库的内存泄漏,或者分享一下在Python、OpenCV和PIL中发现内存泄漏的经验。

3 个回答

1

大卫·马尔科姆今年在PyCon 2011上做了一个演讲,叫做“兄弟,我的内存在哪里?”。他讲了如何调试Python中的内存使用情况,还展示了他开发的一个工具,叫做gdb-heap,这个工具可以追踪内存使用情况,甚至到每一个字节。这个演讲真的非常棒。我猜在Windows上使用gdb-heap可能会有点困难(也许在其他平台上测试一下会有帮助,或者可以在那里调试?),不过演讲中涵盖了很多常见的问题、解决方案等等。

1

我之前也遇到过类似的问题,想找到一个在使用numpy和scipy时出现的严重内存泄漏。通常的Python内存管理工具和诊断方法都没能发现这个泄漏,也没给出任何线索。

在我的情况中,泄漏的源头是scipy和UMFPACK求解器包之间的接口代码。每次调用这个接口对象的构造函数时,它都会调用一个用C语言写的初始化例程,但在接口对象被销毁时却从来没有调用反初始化的例程。这导致了一些临时空间和内部分配的内存不断泄漏,每次调用大约泄漏15MB。在一个有1万到2万次调用的应用中,影响非常严重。因为这些内存分配不是通过Python的内存管理器进行的,所以像heapy这样的工具无法检测到这个泄漏。

最后,我不得不使用valgrind加上“printf”风格的调试方法来找到问题的根源。你可能需要查看一些非Python的内存使用分析工具和检测工具,来找出泄漏的来源。我不在Windows环境下工作,对标准工具链也不太熟悉,所以不能给出具体的建议。也许其他人可以提供一些建议。

1

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

他的代码有一个版本 在这里,里面增加了一些功能,可以用来测量numpy数组的大小。

撰写回答