我正在使用以下代码来获取程序的最大内存使用量。
import os, subprocess , psutil
def mem(cmd):
try:
with open('in.txt','r') as infile, open('out.txt', 'w') as outfile:
p=psutil.Popen("./"+cmd,shell=False,stdin=infile,stdout = outfile)
print p.memory_info()
except Exception:
print "Error"
cmd=raw_input()
mem(cmd)
问题有时是程序的初始运行,内存使用输出为 (0,0),但随后显示正确的输出。我不知道为什么会这样。对于某些程序,例如 c++ 中的 hello world 程序,输出为 pmem(rss=4096, vms=315392)
这大约是 0.3M(我认为输出以字节为单位)但是在 ideone.com 中运行 hello world 程序给出的输出为 ~3M。为什么会有这种差异?
cmd 是可执行文件的名称。
命令的输出print subprocess.check_output(['ps', 'v', '-p', str(p.pid)])
PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND
16150 pts/16 Z+ 0:00 0 0 0 0 0.0 [a.out] <defunct>
我的示例 C++ 程序之一:
`int a[1000000];
int main()
{
return 0;
}`
有时返回 pmem(rss=4096, vms=4313088) 有时返回 pmem(rss=0,vms=0)
最佳答案
这里的问题是 psutils 从/proc 文件系统获取快照,正如您在 source 中看到的那样.
当您运行 hello world 示例时,在某些情况下,它会在 python 有机会从/proc 中读取值之前完成。
一旦进程完成,它实际上不再消耗任何内存。您可以使用 strace 确认这一点。
open("/proc/13420/statm", O_RDONLY) = 3
read(3, "0 0 0 0 0 0 0\n", 1024) = 14
如果您修改您的示例以使用诸如 sleep 之类的东西,您会注意到 psutils 始终如一地返回内存使用量。
#include <iostream>
#include <unistd.h>
int main()
{
std::cout << "Hello World.. sleeping!";
sleep(3);
}
你的 python 脚本的输出...
a.out
meminfo(rss=286720, vms=12931072)
完成您尝试做的事情的一种简单方法是使用/usr/bin/time 命令,在大多数平台上,该命令将为您提供您启动的进程的平均总内存使用量,或者使用 valgrind 作为 J.F Sebastian建议...在我研究和测试我的答案时发帖的人 ;)
Hello World.. sleeping!0.00user 0.00system 0:03.00elapsed 0%CPU
(0avgtext+0avgdata 1144maxresident)k
0inputs+0outputs (0major+348minor)pagefaults 0swaps
关于python - 如何在 Python 中使用 psutil 获取程序的最大内存使用量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22732932/