如何调试Python中的MemoryError?追踪内存使用的工具?
我有一个Python程序,当我给它一个大文件时,它会出现内存错误(MemoryError)。有没有什么工具可以帮我找出是什么占用了内存?
这个程序在处理小文件时运行得很好。显然,这个程序需要一些扩展性上的改进;我只是想弄清楚具体是哪里出了问题。正如某位智者所说的:“在优化之前先进行基准测试”。
(为了避免大家说“加更多内存”的老生常谈:这个程序是在一台32位的WinXP电脑上运行,内存是4GB,所以Python只能使用2GB的可用内存。增加内存在技术上是不可行的,重装64位Windows也不太现实。)
编辑:哎呀,这个问题其实是重复的,参考这个链接:推荐哪个Python内存分析工具?
4 个回答
2
在你的情况下,答案可能非常简单:不要一次性读取整个文件,而是分块处理文件。根据你的使用场景,这可能很简单,也可能很复杂。举个例子,计算一个大文件的MD5校验和时,如果不把整个文件都读进来,效率会高很多。这样的改变在某些SCons的使用场景中大大减少了内存消耗,但用内存分析工具几乎无法追踪到这个问题。
如果你仍然需要内存分析工具:eliben已经建议使用sys.getsizeof。如果这个不够用,可以试试Heapy或Pympler。
4
最简单、最轻量的方法可能就是使用Python自带的内存查询功能,比如sys.getsizeof
。你只需要在你的对象上运行这个命令,先从一个小一点的文件开始,这样就能看看哪些东西占用了很多内存。
10
Heapy 是一个用于 Python 的内存分析工具,这种工具可以帮助你查看程序使用了多少内存。