我正在使用以下代码来获取程序的最大内存使用率.import os, subprocess , psutildef mem(cmd):try:with open(in.txt,r) as infile, open(out.txt, w) as outfile:p=psutil.Popen(./+cmd,shell=False,stdin...

我正在使用以下代码来获取程序的最大内存使用率.
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)
解决方法:
<已终止>表示子进程是一个zombie process(它已经死了,但是父进程尚未读取其状态(p.poll()或p.wait())).看来psutil和ps都表明RSS对于这些进程为零.
结果取决于子进程是否在调用p.memory_info()之前退出.这是一场比赛.如果在C程序的出口处添加延迟,则可能在子进程退出之前调用p.memory_info(),并且您应该获得非零的结果.
The problem is that I can get arbitrary programs to evaluate . The language is also not fixed. Isn’t there an elegant solution to this problem?
您可能需要操作系统支持才能保存有关子进程内存使用情况的信息,即使该进程退出后也是如此.或者,您可以使用内存分析器(例如valgrind)运行该程序并读取其结果.收集结果:
$valgrind --tool=massif cmd arg1 arg2
要查看结果,可以使用ms_print:
$ms_print massif.out.* | less
或GUI Massif-Visualizer
@mdadm suggested一个更简单的解决方案:time command:
from subprocess import Popen, PIPE
p = Popen(['time', '-f', '%M'] + args, stderr=PIPE)
ru_maxrss = int(p.communicate()[1])
print("Maximum rss %d KB" % ru_maxrss)
GNU时间使用wait3()填充资源使用情况信息(如果可用).可以在Python中调用:
import os
from subprocess import Popen
p = Popen(args)
ru = os.wait4(p.pid, 0)[2]
print("Maximum rss %d KB" % ru.ru_maxrss)
我将psutil.Process.memory_info(rss)返回的最大值与os.wait4返回的ru_maxrss值以及valgrind –tool = massif报告的最大总内存进行了比较:它们是相似的.
也可以看看:
> A way to determine a process’s “real” memory usage, i.e. private dirty RSS?
> How is memory usage reported in Linux?
> Find maximum memory consumed by a process specified at the command-line.
本文标题为:如何在Python中使用psutil获得程序的最大内存使用率


基础教程推荐
- 学习笔记114—ubuntu设置python3.7为默认 2023-11-11
- Python变量教程之全局变量和局部变量 2022-08-30
- Python pywin32实现word与Excel的处理 2022-09-03
- python-(Buildbot)无法使用ShellCommand激活virtualenv 2023-11-13
- 用了python多进程,我跑程序花费的时间缩短了4倍 2023-09-04
- Anaconda如何查看自己目前安装的包详解 2023-08-04
- Python—进程、线程、协程 2023-09-03
- 在Windows上安装Fabric(Python库)时出现“错误:找不到vcvarsall.bat” 2023-11-12
- CentOS7下部署Python3+Django+uwsgi+Nginx 2023-09-03
- 在Nginx下运行python 2023-11-12