在脚本结束时,我想返回峰值内存使用情况。阅读other questions后,这是我的脚本:
#!/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
这是我得到的:
$ 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在我的机器上专门安装的方式吗? (这是我与其他人一起使用并由管理员管理的计算机集群。)
编辑:当我使用子进程时会发生同样的事情;执行此脚本
#!/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
给出了这个:
$ 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
答案 0 :(得分:0)
这是替换'os.system'调用的方法
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)
我也没有问题,你觉得你遇到问题:
In [134]: print resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
340840
修改强>
rusage问题很可能是一个内核相关的问题,而你的红帽[{3}}
根本无法解决当然,您可以在代码中有一个单独的线程,查看当前的使用情况,并在整个代码执行过程中存储并存储观察到的最高值
修改2
这是一个完整的解决方案,可以通过Popen跳过资源并监控用法。检查的频率当然必须是相关的,但不要频繁,以便它吃掉所有的cpu。
#!/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循环之前重新格式化每个循环的进程路径并编译正则表达式。但总的来说,我希望这是你所寻求的功能。