Python内存泄漏

239 投票
9 回答
241701 浏览
提问于 2025-04-15 14:22

我有一个运行时间很长的脚本,如果让它一直运行下去,会把我电脑的内存用光。

不想详细讲这个脚本的内容,我有两个问题:

  1. 有没有什么“最佳实践”可以遵循,帮助我防止内存泄漏的发生?
  2. 在Python中,有哪些方法可以用来调试内存泄漏?

9 个回答

34

让我推荐一个我创建的工具,叫做 mem_top

这个工具帮我解决了类似的问题

它可以快速显示出在Python程序中可能导致内存泄漏的主要嫌疑对象

107

我试过之前提到的大部分选项,但发现这个小而直观的工具包是最好的:pympler

追踪那些没有被垃圾回收的对象非常简单,看看这个小例子:

通过 pip install pympler 安装这个工具包

from pympler.tracker import SummaryTracker
tracker = SummaryTracker()

# ... some code you want to investigate ...

tracker.print_diff()

输出会显示所有被添加的对象,以及它们占用的内存。

示例输出:

                                 types |   # objects |   total size
====================================== | =========== | ============
                                  list |        1095 |    160.78 KB
                                   str |        1093 |     66.33 KB
                                   int |         120 |      2.81 KB
                                  dict |           3 |       840 B
      frame (codename: create_summary) |           1 |       560 B
          frame (codename: print_diff) |           1 |       480 B

这个工具包还提供了很多其他功能。可以查看 pympler的文档,特别是 识别内存泄漏 这一部分。

120

看看这篇文章:追踪Python内存泄漏

另外,注意一下垃圾回收模块其实可以设置调试标志。看看set_debug这个函数。此外,还可以查看Gnibbler写的这段代码,它可以帮助你确定在调用之后创建了哪些类型的对象。

撰写回答