【问题标题】:How can I find memory leaks in my Python program? [duplicate]如何在我的 Python 程序中找到内存泄漏? [复制]
【发布时间】:2010-10-06 15:36:12
【问题描述】:

可能重复:
Python memory profiler

我有一个相当复杂(大约 20,000 行)的 Python 程序,经过一些开发后,它在运行时开始消耗越来越多的内存。找出所有内存的用途的最佳工具和技术是什么?

这通常归结为意外保留对对象的引用或扩展模块错误(这不太可能,因为我们已经使用 Python 2.4 安装一段时间了)。

我们正在使用各种第三方库,例如 Twisted、Twisted Conch 和 MySQLdb。

【问题讨论】:

    标签: python debugging memory-leaks twisted


    【解决方案1】:

    通常,未能关闭游标是最常见的内存泄漏类型之一。垃圾收集器看不到游标所涉及的 MySQL 资源。除非显式调用 close() 方法,否则 MySQL 不知道 Python 端已发布。

    经验法则。在您可以管理的尽可能短的代码范围内打开、使用和关闭游标。

    【讨论】:

    • 我一直试图找出为什么我的系统不会在程序中释放资源,而这正是它。这么小的东西,但是当做数千个数据库查询时,它会很快变大!
    • 听起来您应该使用 with 语句和类似 RAII 的类,这样即使抛出异常也不会忘记关闭。
    【解决方案2】:

    Python 的内存由垃圾收集器管理。一般来说,内存泄漏应该没有问题(绝对不是 Python2.5 及更高版本),除非你碰巧用 C/C++ 编写扩展模块。在这种情况下,Valgrind(博客帖子 -http://bruynooghe.blogspot.com/2008/12/finding-memory-leaks-in-python.html)可能会有所帮助。我发现这个人 - http://mg.pov.lt/blog/hunting-python-memleaks 使用 PDB 和 matplotlib 来跟踪内存泄漏。我希望这会有所帮助,我没有修复 Python 内存泄漏的经验。

    【讨论】:

    • 在复杂的程序中,有时您会保留对对象的引用而没有意识到它。这使得垃圾收集器无法回收内存。 Sebastjan 链接到的问题的方式更好;我真正想要的是看看我的内存在哪里被使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2012-04-02
    相关资源
    最近更新 更多