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.
Vom Python-Prozess verwendeter Gesamtspeicher?
rwallace
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ückgebenps
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 zupsutil.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
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_maxrss
was 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
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.
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.
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
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