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.
Antworten
Zu viele Anzeigen?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).
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.
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
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.
- See previous answers
- Weitere Antworten anzeigen