我想知道我的python应用程序的内存使用情况,特别想知道哪些代码块/部分或对象占用了大部分内存。谷歌搜索显示一个商业版本是python内存验证器(仅限Windows)。
开源的是pysizer和heapy。
我没有尝试过任何人,所以我想知道哪一个是最好的考虑:
给出了大部分细节。
我必须对我的代码做最少或不做任何更改。
- 为了找到泄漏源,我建议使用Objgraph。
- @Mikeill有一个地方可以回答这样的问题:软件建议
- 这种情况经常发生,我们应该能够将一个问题转移到另一个论坛。
- 一个提示:如果有人使用gae来检查内存使用情况——这是一个很大的难题,因为这些工具没有输出任何内容或事件没有启动。如果要测试一些小的东西,请将要测试的函数移动到单独的文件中,然后单独运行该文件。
- 让这条评论可见,但关闭,是可怕的-人们仍在使用它来获取分析工具的指导,因为它是谷歌的热门产品之一。我推荐Pympler
由于没有人提到它,我将指向我的模块内存_profiler,它能够打印内存使用情况的逐行报告,并在Unix和Windows上工作(最后一个需要psutil)。输出不是很详细,但目的是让您大致了解代码在哪里消耗了更多的内存,而不是对分配的对象进行详尽的分析。
在用@profile修饰函数并使用-m memory_profiler标志运行代码之后,它将按如下方式逐行打印报告:
1 2 3 4 5 6 7 8
| Line # Mem usage Increment Line Contents
==============================================
3 @profile
4 5.97 MB 0.00 MB def my_func():
5 13.61 MB 7.64 MB a = [1] * (10 ** 6)
6 166.20 MB 152.59 MB b = [2] * (2 * 10 ** 7)
7 13.61 MB -152.59 MB del b
8 13.61 MB 0.00 MB return a |
- 对于我的用例——一个简单的图像操作脚本,而不是一个复杂的系统,它恰好让一些光标保持打开状态——这是最好的解决方案。非常简单,只需在您的代码中添加最少的Gunk,就可以直接进入并了解正在发生的事情。非常适合快速修复,可能也适用于其他应用程序。
- 这太好了。有没有办法用它来收集每个对象的内存使用量?(与每行相反)。理想情况下,从内存中已有对象的IPython会话开始。如果没有,你在这些行上有什么指针吗?
- 它不获取单个对象的内存使用情况。对于这项任务,咕噜/咕噜可能是你想要的。
- 型我发现内存分析器非常简单和易于使用。我想按行而不是按对象进行分析。谢谢你的来信。
- 型@Fabianpedregosa内存分析器如何处理循环,它能识别循环迭代次数吗?
- 型它仅在尝试逐行报告金额并找到重复行时隐式标识循环。在这种情况下,它只需要所有迭代的最大值。
- 型我试图根据输入图像的大小来分析在CPU模式下使用tensorflow的python应用程序的内存使用情况,python -m memory_profiler example.py没有给出正确的结果,mprof给出了与htop相似的结果。
- 型在CPU密集型程序中似乎表现不太好
- 型@Fabianpedregosa:如何指定安装路径?我想把它安装在另一个python文件夹上。谢谢
- 型与其他任何python包一样,pip install --target=/custom/path memory_profiler。
- 型我试过memory_profiler,但认为这不是一个好的选择。它使程序执行速度异常缓慢(在我的例子中,大约是速度的30倍)。
- 型跟踪内存消耗有一个恒定的开销(每行),所以如果您的程序非常长或者有很多快速for/while循环,那么我希望这会显著降低您的程序的速度。在这种情况下,基于时间的(而不是基于行的)探查器可能更好。这是以mprof run 运行的,有关详细信息,请参阅文档。
- 型内存分析器和Heapy解决了两个不同的情况,我猜,一个与每行的内存消耗有关,另一个与对象有关
- 型@豆瓣菜memory_profiler是否缓冲其产量?我可能做了一些错误的事情,但看起来它不是在函数完成时转储它的配置文件,而是等待脚本结束。
- 型它确实要等到脚本完成。否则就不容易了,因为可以再次调用函数,在这种情况下,内存分析器将聚合结果。
Heapy很容易使用。在代码中的某个时刻,您必须编写以下内容:
1 2 3
| from guppy import hpy
h = hpy()
print h.heap() |
这会给您一些这样的输出:
1 2 3 4 5
| Partition of a set of 132527 objects. Total size = 8301532 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 35144 27 2140412 26 2140412 26 str
1 38397 29 1309020 16 3449432 42 tuple
2 530 0 739856 9 4189288 50 dict (no owner) |
您还可以从引用对象的位置找到这些对象,并获取有关这些对象的统计信息,但不知何故,这些对象上的文档有点稀疏。
还有一个图形浏览器,用tk编写。
- 遗憾的是,似乎没有在OSX中构建或安装。至少10.4个。
- 它建立在带有自制的OS X 10.7.1之上,但遗憾的是没有运行:-(
- 如果您使用的是python 2.7,那么可能需要它的主干版本:sourceforge.net/tracker/…,pip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy。
- 最新版本(0.1.9)基于Windows for python 2.6 x64,但h.heap()调用会导致应用程序崩溃。
- 大量的文件是…不好的。但我发现这篇博客文章对于入门很有帮助:smira.ru/wp-content/uploads/2011/08/heapy.html
- Heapy是使用rfoo连接到泄漏的python进程时最容易运行的堆探查器,在多线程应用程序中运行良好,并使用"pip install guppy"与pip很好地工作,通常默认视图可以工作,但hpy提供了几个配置文件数据视图,包括显示按引用使用计数。@joeshaw链接的博客帖子非常有用。
- 注意,heapy不包括在python扩展中分配的内存。如果有人设计了一种机制来包含boost::python个对象,那么最好能看到一些例子!
- 截至2014-07-06,Guppy不支持python 3。
- @Jamessnyder看起来正常的PIP版本(1.10)现在可以使用Python2.7了。
- 刚刚安装好了PIP(python 2.7)。我发现当我调用h.heap()时,我想用它来解决的问题(内存使用不断增加)消失了。你知道为什么会这样吗?
- 如何知道"str"以任何方式消耗了最多的内存?这可能是代码中一百万个点中的一个。不知道在哪里打电话,这里提供的信息是无用的。
我推荐嫁妆。它非常容易设置,并且您需要对代码进行零更改。您可以通过时间查看每种类型的对象计数、查看活动对象列表、查看对活动对象的引用,所有这些都可以通过简单的Web界面查看。
1 2 3 4 5 6 7 8 9 10 11 12 13
| # memdebug.py
import cherrypy
import dowser
def start(port):
cherrypy.tree.mount(dowser.Root())
cherrypy.config.update({
'environment': 'embedded',
'server.socket_port': port
})
cherrypy.server.quickstart()
cherrypy.engine.start(blocking=False) |
导入memdebug并调用memdebug.start。这就是全部。
我没试过Pysizer或Heapy。我会感谢别人的评论。
更新
以上代码是针对CherryPy 2.X、CherryPy 3.X的,server.quickstart方法已被删除,engine.start不取blocking标志。所以如果你用的是CherryPy 3.X。
1 2 3 4 5 6 7 8 9 10 11 12
| # memdebug.py
import cherrypy
import dowser
def start(port):
cherrypy.tree.mount(dowser.Root())
cherrypy.config.update({
'environment': 'embedded',
'server.socket_port': port
})
cherrypy.engine.start() |
- 但是,这是只为奇瑞,如何使用它与一个罪恶的脚本?
- 这不是给奇瑞的。把Cherrypy想象成一个图形用户界面工具包。
- fwiw,pysizer页面pysizer.8325.org似乎推荐heapy,它说类似
- 看起来您上面的代码是与cherrypy 2.x一起使用的。对于cherrypy 3.x,从cherrypy.engine.start()调用中删除blocking=False。
- Dowser有一个通用的wsgi端口,名为Dozer,可以与其他Web服务器一起使用:pypi.python.org/pypi/dozer
- cherrypy 3.1删除了cherrypy.server.quickstart(),所以只需使用cherrypy.engine.start()。
- 我喜欢并使用Dowser,但对我来说,问题是我在其中使用的应用程序给你提供了1000个图形,找到重要的内容会让你很痛苦,在你这样做之后,痛点可能有太多的图形,以至于跟踪页面甚至无法正确加载。所以它的伸缩性不是很好。
- 看起来aminus.net已经不存在了。一些快速的网络搜索发现它的引用只表明它存在于amius.net网站上。告诉水蟒,立刻发现了什么。我会得出这样的结论:嫁妆不再容易获得,而且肯定不会得到维护。
考虑a href="http://mg.pov.lt/objgraph/"rel="noreferrer">objgraph/aa库(请参阅a href="http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks"rel="noreferrer">http://www.lshift.net/blog/2008/11/14/tracing python memory leaks/aa示例用例)。
- objgraph帮助我解决了我今天面临的内存泄漏问题。objgraph.show_growth()特别有用
- 我也发现直视仪真的很有用。你可以做一些像objgraph.by_type('dict')这样的事情来理解所有那些意想不到的dict对象的来源。
muppy是另一个针对python的内存使用状况分析器。这个工具集的重点放在识别内存泄漏上。
Muppy试图帮助开发人员识别Python应用程序的内存泄漏。它可以在运行时跟踪内存使用情况并识别泄漏的对象。此外,还提供了工具,允许定位未释放对象的源。
我发现Meliae比Heapy或Pysizer更实用。如果您碰巧运行一个wsgi webapp,那么Dozer是Dowser的一个很好的中间件包装器。
我正在为python开发一个名为memprof的内存分析器:
http://jmdana.github.io/memprof/
它允许您在执行修饰方法期间记录和绘制变量的内存使用情况。您只需使用以下命令导入库:
1
| from memprof import memprof |
并用以下方法装饰您的方法:
这是一个关于图形外观的示例:
该项目托管在Github中:
网址:https://github.com/jmdana/memprof
- 型我如何使用它?什么是A,B,C?
- 型@tommy.carstensen a、b和c是变量的名称。您可以在github.com/jmdana/memprof上找到文档。如果您有任何问题,请随时在Github中提交问题或向文档中的邮件列表发送电子邮件。
还可以尝试pytracemalloc项目,该项目提供每个python行号的内存使用情况。
编辑(2014/04):它现在有一个QtGUI来分析快照。
- 型tracemalloc现在是Python标准库的一部分。参见docs.python.org/3/library/tracemalloc.html