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

Posted

技术标签:

【中文标题】如何在 Windows 上使用 64 位 Python 调试(可能与 C 库相关的)内存问题?【英文标题】:How can I debug (potentially C-library related) memory issues using 64-bit Python on Windows? 【发布时间】:2011-04-22 22:42:16 【问题描述】:

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

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

【问题讨论】:

我希望有更多潜在的工具。有没有其他人为此而苦苦挣扎? +50 分用于 dll 内存泄漏检测的良好解决方案。 对这个问题没有太多的行动。我开始怀疑这是否反映了 Windows 中糟糕的开发工具——尤其是 64 位 Windows。 感谢所有试图提供帮助的人。我还没有解决方案,我将其归因于 Windows 环境缺乏合适的开发工具。我希望我可以分红,因为我得到了几个部分答案。我尝试根据每项贡献按比例奖励积分。 【参考方案1】:

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

他的代码有一个版本 here,其中添加了一些用于测量 numpy 数组大小的内容。

【讨论】:

谢谢,但它似乎没有看到我的内存泄漏。内存消耗不断上升, objgraph.show_largest_types(10) 没有改变。至少它可以在 Win64 上运行! 我对 OpenCV 不太熟悉,但也许它没有检测到 OpenCV 中使用的内存大小是否合适。如果 python 对象的列表根本没有逐帧增长,则泄漏可能在 C 代码或 python 到 C 的链接中 顺便说一句,你有重现问题的小测试用例吗? 我怀疑你是对的。 PIL 也是 C 代码,对吧?代码很长,可能是 ITAR 控制的,所以恐怕我不能发布它。我将编辑我的问题以专注于检测 C 泄漏。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于如何在 Windows 上使用 64 位 Python 调试(可能与 C 库相关的)内存问题?的主要内容,如果未能解决你的问题,请参考以下文章

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

windows下如何下载并安装Python

如何使用 npm 在 64 位系统上构建 32 位二进制文​​件?

如何编译 32 位程序并在 Windows 7 等 64 位操作系统上运行?

如何使用 .NET 检测 Windows 64 位平台?

检测32位或64位Windows