Memray¶
Die Speichernutzung ist in Python-Projekten nur schwer zu kontrollieren, da die Sprache nicht explizit deutlich macht, wo Speicher zugewiesen wird, Modulimporte können den Verbrauch erheblich steigern, und es ist nur allzu leicht, eine Datenstruktur zu erstellen, die versehentlich unbegrenzt wächst. Data-Science-Projekte sind besonders anfällig für hohen Speicherverbrauch, da sie meist viele große Abhängigkeiten wie NumPy importieren, selbst wenn diese nur an wenigen Stellen verwendet werden.
Memray hilft euch, die Speichernutzung eures Programms zu verstehen, wobei nachverfolgt wird, wo während der Programmausführung Speicher zugewiesen und freigegeben wird. Diese Daten können dann auf verschiedene Weise dargestellt werden, u. a. werden in Flame Graphs die Stacktraces in einem Diagramm zusammengefasst, wobei die Balkenbreite die Größe der Speicherzuweisung darstellt.
Mit memray run kann jeder Python-Befehl profiliert werden. Für die meisten
Projekte empfiehlt sich, zunächst mit check die Funktion zu profilieren, die
euer Projekt lädt. Damit wird der Mindestaufwand überprüft, der zum Starten
eurer Anwendung erforderlich ist, z.B.:
$ uv run memray run src/items/__init__.py check
Writing profile results into src/items/memray-__init__.py.72633.bin
[memray] Successfully generated profile results.
You can now generate reports from the stored allocation records.
Some example commands to generate reports:
/Users/veit/items/.venv/bin/python3 -m memray flamegraph src/items/memray-__init__.py.72633.bin
Der Befehl gibt die Meldung Successfully generated profile results. aus und
erstellt eine Datei PROCESS-ID.bin-Datei. Den Flame Graph können wir
dann erstellen mit:
$ uv run python -m memray flamegraph src/items/memray-__init__.py.72633.bin
Wrote src/items/memray-flamegraph-__init__.py.72633.html
Tipp
In vielen Konsolen könnt ihr die beiden Befehle zusammenfassen mit &&:
$ uv run memray run src/items/__init__.py check && uv run python -m memray flamegraph src/items/memray-__init__.py.72633.bin
Das Ergebnis ist folgende HTML-Datei:
memray flamegraph report¶
Der Kopfbereich der Seite enthält einige Steuerelemente, :abbr: u.a. (unter anderem) zu
- Memory Graph
Anzeige des Speicherplatzes eines Prozesses im Arbeitsspeicher (Resident set size) und des dynamischen Speichers (Heap Memory) über die Zeit
- Stats
Speicherstatistiken, in diesem Fall
Command line: /Users/veit/items/.venv/bin/memray run src/items/api.py check Start time: Sun Feb 08 2026 12:12:27 GMT+0100 (Central European Standard Time) End time: Sun Feb 08 2026 12:12:27 GMT+0100 (Central European Standard Time) Duration: 0:00:00.068000 Total number of allocations: 11142 Total number of frames seen: 0 Peak memory usage: 4.6 MB Python allocator: pymalloc
Darunter befindet sich der Flame-Graph als Eiszapfendiagramm mit den Speicherzuweisungen über die Zeit, wobei der letzte Aufruf ganz unten steht. Die Grafik zeigt die zu einem bestimmten Zeitpunkt ausgeführte Codezeile an wobei die Breite proportional zur zugewiesenen Speichermenge ist; bewegt ihr die Maus darüber, seht ihr weitere Details wie Dateiname, Zeilennummer, zugewiesener Speicher und Anzahl der Zuweisungen.
Tipp
Mit pytest-memray gibt es auch ein Plugin für pytest, mit dem ihr überprüfen könnt, ob von euch festgelegte Obergrenzen für den Speicherverbrauch und Speicherlecks eingehalten werden.