24 Stimmen

Python-Entsprechung von PHPs memory_get_usage()?

Ich habe bereits die folgende Frage gefunden aber ich habe mich gefragt, ob es einen schnelleren und schmutzigeren Weg gibt, eine Schätzung zu erhalten, wie viel Speicher der Python-Interpreter derzeit für mein Skript verwendet, das nicht auf externe Bibliotheken angewiesen ist.

Ich komme von PHP und benutzte memory_get_usage() y memory_get_peak_usage() für diesen Zweck und ich hoffte, ein Äquivalent zu finden.

1voto

Don Kirkby Punkte 46803

Dieselbe Art von Daten, die in /proc/self/status ist auch in /proc/self/statm . Es ist jedoch einfacher zu analysieren, da es sich nur um 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 die Speichernutzung, gemessen in Seiten. Die Spalten sind:

  • Größe (1) Gesamtgröße des Programms (dasselbe wie VmSize in /proc/[pid]/status)
  • Gebietsansässiger (2) Gebietsansässiger Satzgröße (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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X