【发布时间】:2014-05-09 02:26:01
【问题描述】:
我正在使用以下代码来获取程序的最大内存使用量。
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)
【问题讨论】:
-
你能用
["python", "-c", "pass"]这样的已知程序重现它吗?您确定没有抑制异常,即Popen()成功启动? -
不相关:如果是
stderr=PIPE,那么您应该从p.stderr读取,否则如果它在stderr 上生成足够的输出来填充相应的操作系统管道缓冲区,则该进程可能会永远阻塞。 -
@J.F.Sebastian 删除了标准错误。
-
print subprocess.check_output(['ps', 'v', '-p', str(p.pid)])显示什么? -
@J.F.Sebastian 我添加了异常处理。有时输出是(0,0),也不例外
标签: python unix python-2.7 memory