447 Stimmen

Vom Python-Prozess belegter Gesamtspeicher?

Gibt es eine Möglichkeit für ein Python-Programm zu bestimmen, wie viel Speicher es derzeit verwendet? Ich habe Diskussionen über die Speichernutzung für ein einzelnes Objekt gesehen, aber was ich brauche, ist die Gesamtspeichernutzung für den Prozess, so dass ich feststellen kann, wann es notwendig ist, zu beginnen, zwischengespeicherte Daten zu verwerfen.

543voto

Basj Punkte 36025

Hier ist eine nützliche Lösung, die für verschiedene Betriebssysteme, einschließlich Linux, Windows usw., funktioniert:

import os, psutil
process = psutil.Process(os.getpid())
print(process.memory_info().rss)  # in bytes 

Notes :

  • tun pip install psutil wenn es noch nicht installiert ist

  • ein praktischer Einzeiler, wenn Sie schnell wissen wollen, wie viele MB Ihr Prozess benötigt:

    import os, psutil; print(psutil.Process(os.getpid()).memory_info().rss / 1024 ** 2)
  • mit Python 2.7 und psutil 5.6.3, war es process.memory_info()[0] statt (die API wurde später geändert).

289voto

Nathan Craike Punkte 4595

Für Unix-basierte Systeme (Linux, Mac OS X, Solaris) können Sie die getrusage() Funktion aus dem Modul der Standardbibliothek resource . Das resultierende Objekt hat das Attribut ru_maxrss , was die Spitze Speicherverbrauch für den aufrufenden Prozess:

>>> resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
2656  # peak memory usage (kilobytes on Linux, bytes on OS X)

Le Python-Dokumente notieren Sie sich nicht die Einheiten. Schauen Sie in der spezifischen System man getrusage.2 Seite, um die Einheit des Wertes zu überprüfen. Unter Ubuntu 18.04 wird die Einheit als Kilobytes angegeben. Unter Mac OS X sind es Bytes.

Le getrusage() Funktion kann auch gegeben werden resource.RUSAGE_CHILDREN um die Verwendung für Kindprozesse zu erhalten, und (auf einigen Systemen) resource.RUSAGE_BOTH für die gesamte (eigene und untergeordnete) Prozessnutzung.

Wenn Sie sich nur für Linux interessieren, können Sie alternativ die /proc/self/status o /proc/self/statm Datei, wie in anderen Antworten auf diese Frage beschrieben und este auch eine.

69voto

codeape Punkte 93809

Unter Windows können Sie WMI ( Hauptseite , Käserei ):

def memory():
    import os
    from wmi import WMI
    w = WMI('.')
    result = w.query("SELECT WorkingSet FROM Win32_PerfRawData_PerfProc_Process WHERE IDProcess=%d" % os.getpid())
    return int(result[0].WorkingSet)

Unter Linux (aus dem python-Kochbuch http://code.activestate.com/recipes/286222/ :

import os
_proc_status = '/proc/%d/status' % os.getpid()

_scale = {'kB': 1024.0, 'mB': 1024.0*1024.0, 'KB': 1024.0, 'MB': 1024.0*1024.0}

def _VmB(VmKey):
    '''Private.'''
    global _proc_status, _scale
     # get pseudo file  /proc/<pid>/status
    try:
        t = open(_proc_status)
        v = t.read()
        t.close()
    except:
        return 0.0  # non-Linux?
     # get VmKey line e.g. 'VmRSS:  9999  kB\n ...'
    i = v.index(VmKey)
    v = v[i:].split(None, 3)  # whitespace
    if len(v) < 3:
        return 0.0  # invalid format?
     # convert Vm value to bytes
    return float(v[1]) * _scale[v[2]]

def memory(since=0.0):
    '''Return memory usage in bytes.'''
    return _VmB('VmSize:') - since

def resident(since=0.0):
    '''Return resident memory usage in bytes.'''
    return _VmB('VmRSS:') - since

def stacksize(since=0.0):
    '''Return stack size in bytes.'''
    return _VmB('VmStk:') - since

45voto

bayer Punkte 6687

Unter Unix können Sie mit dem ps Werkzeug zur Überwachung:

$ ps u -p 1347 | awk '{sum=sum+$6}; END {print sum/1024}'

wobei 1347 eine Prozess-ID ist. Außerdem wird das Ergebnis in MB angegeben.

27voto

Luc Punkte 4101

Aktuelle Speichernutzung des aktuellen Prozesses unter Linux für Python 2 Python 3 und pypy ohne jegliche Einfuhren:

def getCurrentMemoryUsage():
    ''' Memory usage in kB '''

    with open('/proc/self/status') as f:
        memusage = f.read().split('VmRSS:')[1].split('\n')[0][:-3]

    return int(memusage.strip())

Er liest die Statusdatei des aktuellen Prozesses, nimmt alles nach VmRSS: , nimmt dann alles vor dem ersten Zeilenumbruch (isoliert den Wert von VmRSS) und schneidet schließlich die letzten 3 Bytes ab, die ein Leerzeichen und die Einheit (kB) sind.
Bei der Rückgabe wird jegliches Leerzeichen entfernt und der Wert als Zahl zurückgegeben.

Getestet auf Linux 4.4 und 4.9, aber auch eine frühe Linux-Version sollte funktionieren: siehe unter man proc und die Suche nach den Informationen über die /proc/$PID/status Datei werden für einige Felder Mindestversionen angegeben (z. B. Linux 2.6.10 für "VmPTE"), aber für das Feld "VmRSS" (das ich hier verwende) gibt es keinen solchen Hinweis. Daher nehme ich an, dass es seit einer frühen Version enthalten ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X