Ich habe viel gesucht, aber ich konnte keinen besseren Weg finden.
Da das Dateisystem / proc
verwendet wird, funktioniert es nur auf unterstützten Plattformen (wie Linux).
import os
import re
def peak_memory():
pid = os.getpid()
with open(f'/proc/{pid}/status') as f:
# "VmHWM: 862168 kB"Extrahieren Sie Zeilen im Format
for line in f:
if not line.startswith('VmHWM:'):
continue
return int(re.search('[0-9]+', line)[0])
raise ValueError('Not Found')
Innerhalb einer bestimmten Funktion trat ein Phänomen auf, bei dem die Speichernutzung vorübergehend zunahm.
Wenn Sie die Funktion profilieren und herausfinden möchten, wo die Speichernutzung zunimmt, sollten Sie Speicherprofiler verwenden. Dieses Mal wusste ich, wo es zunehmen würde, und ich konnte nicht anders, aber ich wollte herausfinden, wie viel es zunehmen würde, also musste ich die Spitzenauslastung kennen.
Sie können die aktuelle Speichernutzung mit psutil abrufen. Siehe this.
Es ist jedoch kein Peak, wie zum Beispiel bei einem solchen Code
Nehmen Sie den aktuell verwendeten Speicher
import psutil
def f():
a = [0] * 20000000
print(psutil.Process().memory_full_info())
f()
print(psutil.Process().memory_full_info())
Das Ergebnis ist wie folgt.
Nicht viel anders
pfullmem(rss=12406784, vms=18395136, shared=6369280, text=4096, lib=0, data=6225920, dirty=0, uss=8134656, pss=9319424, swap=0)
pfullmem(rss=12619776, vms=18354176, shared=6385664, text=4096, lib=0, data=6184960, dirty=0, uss=8253440, pss=9438208, swap=0)
Ich benutze viel Speicher innerhalb von f ()
, aber ich benutze ihn nicht draußen, also kann ich von außen nichts sagen.
Nimm es in f
import psutil
def f():
a = [0] * 20000000
print('inner: ', psutil.Process().memory_full_info())
print('before:', psutil.Process().memory_full_info())
f()
print('after: ', psutil.Process().memory_full_info())
In diesem Fall sieht es so aus:
Ich benutze viel nur in der Mitte
before: pfullmem(rss=12476416, vms=18395136, shared=6443008, text=4096, lib=0, data=6225920, dirty=0, uss=8179712, pss=9407488, swap=0)
inner: pfullmem(rss=172519424, vms=178356224, shared=6520832, text=4096, lib=0, data=166187008, dirty=0, uss=168300544, pss=169528320, swap=0)
after: pfullmem(rss=12754944, vms=18354176, shared=6520832, text=4096, lib=0, data=6184960, dirty=0, uss=8298496, pss=9526272, swap=0)
Es wäre schön, wenn ich Code einfügen könnte, der die Speichernutzung genau dort festlegt, wo er anscheinend Speicher verwendet, aber das wollte ich nicht.
Nehmen Sie Spitzenauslastung
import os
import re
def peak_memory():
pid = os.getpid()
with open(f'/proc/{pid}/status') as f:
for line in f:
if not line.startswith('VmHWM:'):
continue
return int(re.search('[0-9]+', line)[0])
raise ValueError('Not Found')
def f():
a = [0] * 20000000
print('before:', peak_memory(), 'KB')
f()
print('after: ', peak_memory(), 'KB')
Infolgedessen wurde es so.
Steigt danach an
before: 9072 KB
after: 165532 KB
Ich bin glücklich.
Messen Sie den Speicherverbrauch von Linux-Programmen
Verwenden Sie den Code in diesem Artikel für Python-Skripte, die von Ihnen oder Ihrem Unternehmen entwickelt wurden.
Recommended Posts