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?Nachfolgend finden Sie meinen Funktionsdekorator, mit dem Sie verfolgen können, wie viel Speicher dieser Prozess vor dem Funktionsaufruf verbraucht hat, wie viel Speicher er nach dem Funktionsaufruf verbraucht 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
Wenn Sie also eine Funktion mit ihr dekoriert haben
from utils import track
@track
def list_create(n):
print("inside list create")
return [1] * n
Sie werden diese Ausgabe sehen können:
inside list create
list_create: memory before: 45,928,448, after: 46,211,072, consumed: 282,624; exec time: 00:00:00
Noch einfacher zu bedienen als /proc/self/status
: /proc/self/statm
. Es ist nur eine durch Leerzeichen getrennte Liste von mehreren Statistik . Ich habe nicht feststellen können, ob beide Dateien immer vorhanden sind.
/proc/[pid]/statm
Liefert Informationen über den Speicher u Die Spalten sind:
- Größe (1) insgesamt p (dasselbe wie VmSize in /proc/[pid]/status)
- wohnhaft (2) wohnhaft (gleich wie VmRSS in /proc/[pid]/status)
- shared (3) Anzahl der residenten gemeinsam genutzten Seiten (d. h., die durch eine Datei gesichert sind) (dasselbe wie RssFile+RssShmem in /proc/[pid]/status)
- Text (4) Text (Code)
- lib (5) Bibliothek (unbenutzt seit Linux 2.6; immer 0)
- Daten (6) Daten + Stapel
- dt (7) dirty pages (seit Linux 2.6 unbenutzt; immer 0)
Hier ist ein einfaches Beispiel:
from pathlib import Path
from resource import getpagesize
PAGESIZE = getpagesize()
PATH = Path('/proc/self/statm')
def get_resident_set_size() -> int:
"""Return the current resident set size in bytes."""
# statm columns are: size resident shared text lib data dt
statm = PATH.read_text()
fields = statm.split()
return int(fields[1]) * PAGESIZE
data = []
start_memory = get_resident_set_size()
for _ in range(10):
data.append('X' * 100000)
print(get_resident_set_size() - start_memory)
Das Ergebnis ist eine Liste, die in etwa so aussieht:
0
0
368640
368640
368640
638976
638976
909312
909312
909312
Sie können sehen, dass sie nach etwa 3 Zuweisungen von 100.000 Bytes um etwa 300.000 Bytes ansteigt.
Ich mag es , danke für @bayer. Ich bekomme jetzt ein spezifisches Prozesszählwerkzeug.
# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB
# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB
Fügen Sie meine Prozessliste bei.
$ ps aux | grep python
root 943 0.0 0.1 53252 9524 ? Ss Aug19 52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root 950 0.6 0.4 299680 34220 ? Sl Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root 3803 0.2 0.4 315692 36576 ? S 12:43 0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny 23325 0.0 0.1 47460 9076 pts/0 S+ 17:40 0:00 python
jonny 24651 0.0 0.0 13076 924 pts/4 S+ 18:06 0:00 grep python