如何在Python中调试MemoryError?跟踪内存使用的工具?

时间:2009-11-05 16:36:26

标签: python memory-management profiling out-of-memory

我有一个Python程序,当我将它提供给一个大文件时会死于MemoryError。是否有任何工具可以用来确定使用内存的是什么?

这个程序在较小的输入文件上运行良好。该程序显然需要一些可扩展性改进;我只想弄清楚在哪里。 “优化之前的基准”,正如一位聪明人曾经说过的那样。

(只是为了防止不可避免的“添加更多RAM”答案:这是在一个带有4GB RAM的32位WinXP盒子上运行,因此Python可以访问2GB的可用内存。从技术上讲,添加更多内存是不可能的。重新安装我的使用64位Windows的PC是不实用的。)

编辑:哎呀,这是Which Python memory profiler is recommended?

的副本

4 个答案:

答案 0 :(得分:9)

Heapy是Python的内存分析器,它是您需要的工具类型。

答案 1 :(得分:3)

最简单轻量的方法可能是使用Python的built in memory query capabilities,例如sys.getsizeof - 只需在你的对象上运行它以减少问题(即一个较小的文件),看看需要什么很多记忆。

答案 2 :(得分:2)

在您的情况下,答案可能非常简单:不要一次读取整个文件,而是按块处理文件块。根据您的使用场景,这可能非常简单或复杂。例如,对于大型文件,可以更有效地完成MD5校验和计算,而无需读取整个文件。后一种更改大大减少了某些SCons使用场景中的内存消耗,但几乎不可能使用内存分析器跟踪。

如果你还需要内存探查器:eliben已经建议使用sys.getsizeof。如果没有削减它,请尝试Heapy或Pympler。

答案 3 :(得分:1)

您要求提供工具建议:

Python Memory Validator允许您监视Python应用程序的内存使用情况,分配位置,GC集合,对象实例,内存快照等。仅限Windows。

http://www.softwareverify.com/python/memory/index.html

免责声明:我参与了该软件的创建。