我有一个长时间运行的脚本,如果让它运行足够长的时间,它将占用系统上的所有内存。
在不讨论剧本细节的情况下,我有两个问题:
是否有任何“最佳实践”可以遵循,这将有助于防止泄漏的发生? 在Python中有哪些调试内存泄漏的技术?
我有一个长时间运行的脚本,如果让它运行足够长的时间,它将占用系统上的所有内存。
在不讨论剧本细节的情况下,我有两个问题:
是否有任何“最佳实践”可以遵循,这将有助于防止泄漏的发生? 在Python中有哪些调试内存泄漏的技术?
当前回答
让我推荐我创建的mem_top工具
它帮助我解决了一个类似的问题
它会立即显示Python程序中最可能出现内存泄漏的地方
其他回答
让我推荐我创建的mem_top工具
它帮助我解决了一个类似的问题
它会立即显示Python程序中最可能出现内存泄漏的地方
我尝试了前面提到的大多数选项,但发现这个小而直观的包是最好的: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的文档,特别是识别内存泄漏一节。
查看这篇文章:跟踪python内存泄漏
另外,请注意,垃圾收集模块实际上可以设置调试标志。看看set_debug函数。另外,查看Gnibbler编写的代码,以确定调用后创建的对象类型。
要检测和定位长时间运行进程的内存泄漏,例如在生产环境中,您现在可以使用堆栈影响。它在下面使用tracemalloc。更多信息在这篇文章。
不确定python中内存泄漏的“最佳实践”,但python应该通过它的垃圾收集器清除自己的内存。所以我主要会从检查一些短的循环列表开始,因为它们不会被垃圾收集器拾取。