2014-02-19 3 views
2

В конце скрипта я хотел бы вернуть пиковое использование памяти. После прочтения otherquestions, вот мой сценарий:Resource.getrusage() всегда возвращает 0

#!/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

Интересно, я не могу воспроизвести его здесь. – Bach

+0

0 код выхода из grep не так ли? Вам нужно поймать stdout того, что вы запускаете при запуске os.system – deinonychusaur

+0

@deinonychusaur Я попытался добавить «tmp =» перед os.system, но ничего не изменил. «0» происходит от print resource.getrusage. – tflutre

ответ

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 

Edit

rusage вопрос вполне может быть ядром зависит вопрос и просто не доступны на красной шляпе дист http://bytes.com/topic/python/answers/22489-getrusage

Вы, конечно, может быть отдельный поток в своем коде, глядя на текущее использование и хранение на протяжении исполнения кода и сохранить наибольшее значение наблюдается

Edit 2

Вот полное решение пропуск ресурсов и мониторинга обыкновений через Popen , Частота проверки должна, конечно, быть релевантной, но не частой, чтобы она ест весь процессор.

#!/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 может быть оптимизирована путем расчета времени сна один раз, не переформатирования путь к процессу каждый цикл и компиляции регулярного выражения перед входом в то время цикла. Но я надеюсь, что это была функциональность, которую вы искали.

+0

спасибо, но это не решит проблему, см. Мое редактирование. – tflutre

+0

добавлена ​​информация/ссылка, которая может быть вашей конкретной проблемой. – deinonychusaur

+0

Является ли мое редактирование 2 достаточным для решения? – deinonychusaur

Смежные вопросы