Vom Python-Prozess verwendeter Gesamtspeicher?

Lesezeit: 7 Minuten

Benutzer-Avatar
rwallace

Gibt es eine Möglichkeit für ein Python-Programm, festzustellen, 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, damit ich bestimmen kann, wann es notwendig ist, mit dem Verwerfen von zwischengespeicherten Daten zu beginnen.

Benutzer-Avatar
Basj

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

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

Anmerkungen:

  • tun pip install psutil wenn es noch nicht installiert ist

  • praktischer Einzeiler, wenn Sie schnell wissen möchten, 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 das process.memory_info()[0] stattdessen (es gab später eine Änderung in der API).

  • psutil ist plattformübergreifend und kann die gleichen Werte wie die zurückgeben ps Kommandozeilentool: pythonhosted.org/psutil/#psutil.Process.memory_info

    – Amos

    3. Juli 2014 um 21:38 Uhr

  • Warum stimmt diese Nummer nicht mit der im Process Explorer überein? Die Zahl von psutil scheint immer um etwa 10% größer zu sein.

    – Worte für den Fall

    13. Mai 2015 um 22:42 Uhr

  • Beachten Sie, dass psutil nicht in der Standardbibliothek enthalten ist

    – william_grisaitis

    18. August 2016 um 19:11 Uhr

  • Für neuere Versionen von psutil, psutil.Process() ist äquivalent zu psutil.Process(os.getpid()). Das ist eine Sache weniger, an die Sie beim Tippen denken müssen.

    – rnorris

    26. April 2019 um 3:07 Uhr

  • Warum verwenden Sie RSS? Im Psutil-Dokument: rss | residente Satzgröße, vms | gesamte Programmgröße. Also ich denke, die letzte Zeile sollte sein print(process.memory_info().vms)

    – Halil İbrahim Oymacı

    25. Oktober 2019 um 13:16 Uhr

Benutzer-Avatar
Nathan Craike

Für Unix-basierte Systeme (Linux, Mac OS X, Solaris) können Sie die verwenden getrusage() Funktion aus dem Standard-Bibliotheksmodul resource. Das resultierende Objekt hat das Attribut ru_maxrsswas die gibt Gipfel Speicherverbrauch für den aufrufenden Prozess:

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

Das Python-Dokumente notieren Sie sich nicht die Einheiten. Beziehen Sie sich auf Ihr spezifisches System man getrusage.2 Seite, um die Einheit für den Wert zu überprüfen. Unter Ubuntu 18.04 wird die Einheit als Kilobyte notiert. Unter Mac OS X sind es Bytes.

Das getrusage() Funktion kann auch angegeben werden resource.RUSAGE_CHILDREN um die Verwendung für untergeordnete Prozesse zu erhalten, und (auf einigen Systemen) resource.RUSAGE_BOTH für die gesamte (selbst und untergeordnete) Prozessnutzung.

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

  • Okay, geht. Ich war mir nicht sicher, ob SO einen Prozess zum Zusammenführen von Fragen hatte oder was. Der doppelte Beitrag sollte den Leuten teilweise zeigen, dass es für beide Fragen eine Standardbibliothekslösung gibt … und teilweise für den Vertreter. 😉 Soll ich diese Antwort löschen?

    – Nathan Craike

    6. Oktober 2011 um 3:19 Uhr


  • Mac OS gibt RSS definitiv in Byte zurück, Linux gibt es in Kilobyte zurück.

    – Neil

    6. Dezember 2013 um 23:33 Uhr

  • Die Einheiten sind NICHT in Kilobyte. Es ist plattformabhängig, also müssen Sie resource.getpagesize() verwenden, um es herauszufinden. Die angegebenen Python-Dokumente (docs.python.org/2/library/resource.html#resource-usage) ist eigentlich ganz klar. Es ist 4096 in meiner Box.

    – Ben-Lin

    15. April 2014 um 16:53 Uhr


  • @BenLin Diese Python-Dokumente sind eindeutig falsch oder es gibt einen Fehler in der Mac-Version. Die von getrusage verwendete Einheit und der von getpagesize zurückgegebene Wert sind definitiv unterschiedlich.

    – Andreas

    8. Juli 2015 um 17:56 Uhr

  • Die gefragte Frage aktuell Verwendungszweck. Beachten Sie, dass dies der Fall ist maximal Verwendungszweck. (Immer noch eine nützliche Antwort, die nur Leute warnt, die sie versehentlich kopieren und einfügen.)

    – Luc

    23. Januar 2018 um 8:29 Uhr

Benutzer-Avatar
Codeape

Unter Windows können Sie WMI (Startseite, Käseladen):

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

  • Der Windows-Code funktioniert bei mir nicht. Diese Änderung bewirkt: return int(result[0].WorkingSet)

    – John Fouhy

    31. August 2010 um 0:46 Uhr


  • Dieser Windows-Code funktioniert für mich unter Windows 7 x64 nicht, auch nach der Kommentaränderung von John Fouhy.

    – Basj

    7. Februar 2014 um 15:59 Uhr

  • Ich habe diesen Fehler: Rückgabe [ wmi_object (obj, instance_of, fields) for obj in self._raw_query(wql) ] Datei “C:\Python27\lib\site-packages\win32com\client\util.py”, Zeile 84, im nächsten Return _get_good_object_(self._iter.next(), resultCLSID = self.resultCLSID) pywintypes.com_error: (-2147217385, ‘OLE error 0x80041017’, None, None) kann mir jemand helfen? Ich habe 8 x64 gewonnen, aber Python auf x32

    – Radu Vlad

    9. September 2014 um 6:06 Uhr

  • Hinweis: Ich habe das Windows-Beispiel gemäß dem Vorschlag von John Fouhy aktualisiert, nachdem ich die (neueste) Quelle des wmi-Moduls überprüft habe. Siehe auch (1), (2).

    – jedwards

    17. März 2016 um 16:24 Uhr


  • @jedwards: WorkingSet ist in >90% der Fälle eine sehr schlechte Zahl. Es ist nur der Teil des Speichers, der sich derzeit im RAM befindet

    – Thomas Weller

    16. Juli 2020 um 20:26 Uhr

Unter Unix können Sie die verwenden ps Tool zur Überwachung:

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

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

Benutzer-Avatar
Luc

Aktuelle Speicherauslastung des aktuellen Prozesses auf Linuxfür Python 2Python 3und Pypyohne jegliche Importe:

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())

Es 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.
Um zurückzukehren, entfernt es alle Leerzeichen und gibt sie als Zahl zurück.

Getestet auf Linux 4.4 und 4.9, aber auch eine frühe Linux-Version sollte funktionieren: mal reinschauen man proc und Suche nach Informationen über die /proc/$PID/status -Datei erwähnt es Mindestversionen für einige Felder (wie Linux 2.6.10 für “VmPTE”), aber das Feld “VmRSS” (das ich hier verwende) hat keine solche Erwähnung. Daher gehe ich davon aus, dass es seit einer frühen Version drin ist.

Benutzer-Avatar
Ronnie

Unten ist mein Funktions-Decorator, mit dem Sie verfolgen können, wie viel Speicher dieser Prozess vor dem Funktionsaufruf verbraucht, wie viel Speicher er nach dem Funktionsaufruf verwendet und wie lange die Funktion ausgeführt wird.

import time
import os
import psutil


def elapsed_since(start):
    return time.strftime("%H:%M:%S", time.gmtime(time.time() - start))


def get_process_memory():
    process = psutil.Process(os.getpid())
    return process.memory_info().rss


def track(func):
    def wrapper(*args, **kwargs):
        mem_before = get_process_memory()
        start = time.time()
        result = func(*args, **kwargs)
        elapsed_time = elapsed_since(start)
        mem_after = get_process_memory()
        print("{}: memory before: {:,}, after: {:,}, consumed: {:,}; exec time: {}".format(
            func.__name__,
            mem_before, mem_after, mem_after - mem_before,
            elapsed_time))
        return result
    return wrapper

Also, wenn Sie eine Funktion damit dekoriert haben

from utils import track

@track
def list_create(n):
    print("inside list create")
    return [1] * n

Sie können diese Ausgabe sehen:

inside list create
list_create: memory before: 45,928,448, after: 46,211,072, consumed: 282,624; exec time: 00:00:00

Benutzer-Avatar
A.Ametov

Für Python 3.6 und psutil 5.4.5 ist es einfacher zu verwenden memory_percent() Funktion aufgelistet hier.

import os
import psutil
process = psutil.Process(os.getpid())
print(process.memory_percent())

  • dies erfordert lib psutil

    – konf

    23. Mai 2020 um 10:41 Uhr

1099190cookie-checkVom Python-Prozess verwendeter Gesamtspeicher?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy