.. SPDX-FileCopyrightText: 2026 cusy GmbH .. .. SPDX-License-Identifier: BSD-3-Clause 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 :doc:`/workspace/numpy/index` 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, :abbr:`u. a. (uter anderem)` 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, :abbr:`z.B. (zum Beispiel)`: .. code-block:: console $ 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 :samp:`{PROCESS-ID}.bin`-Datei. Den *Flame Graph* können wir dann erstellen mit: .. code-block:: console $ uv run python -m memray flamegraph src/items/memray-__init__.py.72633.bin Wrote src/items/memray-flamegraph-__init__.py.72633.html .. tip:: In vielen Konsolen könnt ihr die beiden Befehle zusammenfassen mit ``&&``: .. code-block:: console $ 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: .. figure:: memray-flamegraph.png :alt: memray flamegraph report 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 .. code-block:: text 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. .. tip:: Mit :ref:`python-basics:pytest_memray` gibt es auch ein Plugin für :doc:`python-basics:test/pytest/index`, mit dem ihr überprüfen könnt, ob von euch festgelegte Obergrenzen für den Speicherverbrauch und Speicherlecks eingehalten werden.