首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Resource.getrusage()总是返回0

Resource.getrusage()总是返回0
EN

Stack Overflow用户
提问于 2014-02-19 15:50:26
回答 1查看 2.3K关注 0票数 2

在脚本的末尾,我想返回峰值内存使用情况。在阅读了other questions之后,下面是我的脚本:

代码语言:javascript
复制
#!/usr/bin/env python
import sys, os, resource, platform
print platform.platform(), platform.python_version()
os.system("grep 'VmRSS' /proc/%s/status" % os.getpid())
print resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
dat = [x for x in xrange(10000000)]
os.system("grep 'VmRSS' /proc/%s/status" % os.getpid())
print resource.getrusage(resource.RUSAGE_SELF).ru_maxrss

我得到的是:

代码语言:javascript
复制
$ test.py
Linux-2.6.18-194.26.1.el5-x86_64-with-redhat-5.5-Final 2.7.2
VmRSS:      4472 kB
0
VmRSS:    322684 kB
0

为什么resource.getrusage总是给我0?

同样的事情也发生在终端上。这能归因于Python在我的机器上的具体安装方式吗?(这是我和其他人一起使用的一个计算机集群,由管理员管理。)

编辑:当我使用子进程时也会发生同样的事情;执行这个脚本

代码语言:javascript
复制
#!/usr/bin/env python
import sys, os, resource, platform
from subprocess import Popen, PIPE
print platform.platform(), platform.python_version()
p = Popen(["grep", "VmRSS", "/proc/%s/status" % os.getpid()], shell=False, stdout=PIPE)
print p.communicate()
print "resource:", resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
dat = [x for x in xrange(10000000)]
p = Popen(["grep", "VmRSS", "/proc/%s/status" % os.getpid()], shell=False, stdout=PIPE)
print p.communicate()
print "resource:", resource.getrusage(resource.RUSAGE_SELF).ru_maxrss

给出如下内容:

代码语言:javascript
复制
$ test.py
Linux-2.6.18-194.26.1.el5-x86_64-with-redhat-5.5-Final 2.7.2
('VmRSS:\t    4940 kB\n', None)
resource: 0
('VmRSS:\t  323152 kB\n', None)
resource: 0
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-19 17:01:55

以下是替换´os.system´调用的一种方法

代码语言:javascript
复制
In [131]: from subprocess import Popen, PIPE

In [132]: p = Popen(["grep", "VmRSS", "/proc/%s/status" % os.getpid()], shell=False, stdout=PIPE)

In [133]: p.communicate()
Out[133]: ('VmRSS:\t  340832 kB\n', None)

我也没有问题去运行你觉得你有问题的线路:

代码语言:javascript
复制
In [134]: print resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
340840

编辑

rusage问题很可能是一个与内核相关的问题,而且在您的红帽子区http://bytes.com/topic/python/answers/22489-getrusage中根本不可用。

当然,您可以在代码中有一个单独的线程,查看当前的使用情况,并在整个代码执行过程中进行存储,并存储所观察到的最高值。

编辑2

这里有一个完整的解决方案,通过Popen跳过资源和监视使用情况。当然,检查的频率必须是相关的,而不是频繁的,这样它就占用了所有的cpu。

代码语言:javascript
复制
#!/usr/bin/env python

import threading
import time
import re
import os
from subprocess import Popen, PIPE

maxUsage = 0
keepThreadRunning = True


def memWatch(freq=20):

    global maxUsage
    global keepThreadRunning

    while keepThreadRunning:

        p = Popen(["grep", "VmRSS", "/proc/%s/status" % os.getpid()],
                  shell=False, stdout=PIPE)

        curUsage = int(re.search(r'\d+', p.communicate()[0]).group())

        if curUsage > maxUsage:

            maxUsage = curUsage

        time.sleep(1.0 / freq)


if __name__ == "__main__":

    t = threading.Thread(target=memWatch)
    t.start()

    print maxUsage
    [p for p in range(1000000)]
    print maxUsage
    [str(p) for p in range(1000000)]
    print maxUsage
    keepThreadRunning = False
    t.join()

可以通过计算睡眠时间一次来优化memWatch函数,而不是重新格式化每个循环的进程路径,并在进入while循环之前编译正则表达式。但我希望这是你想要的功能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21885545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档