如何测量Python程序的整体内存需求
我有一个用Python 2.4.4写的金融定价应用程序,它作为Excel的插件运行。Excel对所有插件的内存限制是1GB,所以如果任何插件的进程尝试分配超过1GB的内存,Excel就会崩溃。
我最近对程序做了一些修改,这可能改变了程序的整体内存需求。我想弄清楚是否有任何显著的变化,如果没有的话,我可以向我的管理层保证,内存使用增加不会导致程序失败。
顺便提一下,可以通过命令行运行在Excel中运行的相同功能:
实际上,我可以从普通的Windows命令提示符提供所有从Excel生成的参数。这意味着如果我有一种方法可以单独发现这个进程的内存需求,我就可以安全地推断出在Excel中运行时它会使用类似的内存。
我对内存分析工具提供的详细信息不感兴趣:我不需要知道每个函数尝试分配多少内存。我需要知道的是程序运行所需的最小内存量,并且我需要保证如果程序在1GB的限制内运行,它就能正常工作。
有没有什么建议可以帮助我做到这一点?
平台是Windows XP 32位,Python 2.4.4。
2 个回答
最简单的办法就是从命令行运行你的应用程序,然后用任务管理器查看它使用了多少内存。
补充:如果你想了解更复杂的内容,可以看看这个问题和答案 如何在Windows中用C++获取内存使用情况
补充:还有一个选择。可以下载 Process Explorer。它基本上是一个功能更强大的任务管理器。它可以帮你记录一个进程的最高内存使用量。(而且是免费的,所以你不用担心费用)
我认为Windows XP并不会像Linux那样记录一个程序的最高内存需求(Linux在/proc/pid/status中会有这样的信息)。你可以使用一些第三方工具,比如这个工具,把它设置为频繁地“轮询”这个进程,这样就有更大的机会抓到正确的最高内存使用情况。
不过,有一个更好的方法,虽然它并没有直接回答你的问题,就是尝试在一个作业对象下运行这个进程,并使用SetInformationJobObject来设置一个合适的JOBOBJECT_EXTENDED_LIMIT_INFORMATION
结构,其中包含一个合适的ProcessMemoryLimit
(例如,最大虚拟内存为1GB),并在JOBOBJECT_BASIC_LIMIT_INFORMATION
中设置正确的标志来激活这个限制。这样,如果程序运行正常,你就可以确定它从来没有使用超过1GB的虚拟内存——否则,它会因为内存不足而崩溃。
这种编程的方法也可以测量峰值,但相比使用现成的工具,它有点复杂,所以我觉得不太适合这个目的。我不知道有没有现成的工具可以让你使用作业对象来专门限制进程可用的资源(虽然我不会惊讶地听到有这样的工具,无论是免费的还是商业的,但我自己从来没有遇到过)。