python - 如何在 Python 中使用 psutil 获取程序的最大内存使用量

标签 python unix python-2.7 memory

我正在使用以下代码来获取程序的最大内存使用量。

    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/

相关文章:

python - Python UDF 在 Apache Pig 中的使用

python - Docker、python3 yaml.safe_load()读取中文文件无法工作

python - 每两个逗号切割字符串

linux - 在 Bash 中将多个摄氏度值转换为华氏度

python - python中的命名字典

python - 如何将具有一列的 csv 文件转换为 Python 中的字典?

c++ - c++ 中是否有任何函数来检查特定路径中给定的文件是否为脚本(.sh)文件

linux - 如何在句子之间进行比较并计算相似度?

performance - 加速python中的逐元素数组乘法

python - Functools.update_wrapper() 不能正常工作