我有一个长时间运行的脚本,如果让它运行足够长的时间,它将占用系统上的所有内存。

在不讨论剧本细节的情况下,我有两个问题:

是否有任何“最佳实践”可以遵循,这将有助于防止泄漏的发生? 在Python中有哪些调试内存泄漏的技术?


当前回答

要检测和定位长时间运行进程的内存泄漏,例如在生产环境中,您现在可以使用堆栈影响。它在下面使用tracemalloc。更多信息在这篇文章。

其他回答

让我推荐我创建的mem_top工具

它帮助我解决了一个类似的问题

它会立即显示Python程序中最可能出现内存泄漏的地方

要检测和定位长时间运行进程的内存泄漏,例如在生产环境中,您现在可以使用堆栈影响。它在下面使用tracemalloc。更多信息在这篇文章。

这绝不是详尽的建议。但是,在考虑避免未来的内存泄漏(循环)时,要记住的第一件事是确保任何接受回调引用的东西都应该将该回调存储为弱引用。

查看这篇文章:跟踪python内存泄漏

另外,请注意,垃圾收集模块实际上可以设置调试标志。看看set_debug函数。另外,查看Gnibbler编写的代码,以确定调用后创建的对象类型。

Tracemalloc模块从Python 3.4开始作为内置模块集成,显然,它也可以作为第三方库用于先前版本的Python(不过还没有测试它)。

这个模块能够输出分配最多内存的精确文件和行。恕我直言,这个信息比为每种类型分配的实例数量(99%的情况下最终会有很多元组,这是一个线索,但在大多数情况下几乎没有帮助)有价值得多。

我建议你将tracemalloc与吡拉西矿联合使用。十有八九,在pyrasite-shell中运行前10个代码片段将为您提供足够的信息和提示,以在10分钟内修复泄漏。然而,如果您仍然无法找到泄漏原因,pyrasite-shell结合本文中提到的其他工具可能也会给您更多的提示。您还应该看看pyrasite提供的所有额外帮助(例如内存查看器)。