Python内存泄漏
我有一个运行时间很长的脚本,如果让它一直运行下去,会把我电脑的内存用光。
不想详细讲这个脚本的内容,我有两个问题:
- 有没有什么“最佳实践”可以遵循,帮助我防止内存泄漏的发生?
- 在Python中,有哪些方法可以用来调试内存泄漏?
9 个回答
34
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写的这段代码,它可以帮助你确定在调用之后创建了哪些类型的对象。