So verfolgen Sie die Speicherzuweisung in Python


Dieses Tutorial ist eine Einführung in die Verfolgung der Speicherzuweisung in Python mithilfe des integrierten Tracemalloc-Moduls.

Wenn Sie in Python programmieren, müssen Sie sich normalerweise nicht mit den Details der Speicherzuweisung auseinandersetzen. Die Nachverfolgung der Speicherzuweisung kann jedoch hilfreich sein, insbesondere wenn Sie mit speicherintensiven Vorgängen und großen Datenmengen arbeiten.

Das in Python integrierte Tracemalloc-Modul verfügt über Funktionen, die Ihnen helfen, die Speichernutzung zu verstehen und Anwendungen zu debuggen. Mit Tracemalloc können Sie ermitteln, wo und wie viele Speicherblöcke zugewiesen wurden, Snapshots erstellen, Unterschiede zwischen Snapshots vergleichen und vieles mehr.

Einige davon werden wir uns in diesem Tutorial ansehen. Fangen wir an.

Bevor Sie beginnen

Für die Datenverarbeitung verwenden wir ein einfaches Python-Skript. Dazu erstellen wir einen Beispieldatensatz und verarbeiten ihn. Neben einer aktuellen Version von Python benötigen Sie in Ihrer Arbeitsumgebung auch Pandas und NumPy.

Erstellen Sie eine virtuelle Umgebung und aktivieren Sie sie:

$ python3 -m venv v1
$ source v1/bin/activate

Und installieren Sie die erforderlichen Bibliotheken:

$ pip3 install numpy pandas

Den Code für dieses Tutorial finden Sie auf GitHub.

Erstellen Sie einen Beispieldatensatz mit Bestelldetails

Wir erstellen eine Beispiel-CSV-Datei mit Bestelldetails. Sie können das folgende Skript ausführen, um eine CSV-Datei mit 100.000 Bestelldatensätzen zu erstellen:

# create_data.py
import pandas as pd
import numpy as np

# Create a sample dataset with order details
num_orders = 100000
data = {
	'OrderID': np.arange(1, num_orders + 1),
	'CustomerID': np.random.randint(1000, 5000, num_orders),
	'OrderAmount': np.random.uniform(10.0, 1000.0, num_orders).round(2),
	'OrderDate': pd.date_range(start='2023-01-01', periods=num_orders, freq='min')
}

df = pd.DataFrame(data)
df.to_csv('order_data.csv', index=False)

Dieses Skript füllt einen Pandas-Datenrahmen mit 100.000 Datensätzen mit den folgenden vier Funktionen und exportiert den Datenrahmen in eine CSV-Datei:

  • OrderID: Eindeutige Kennung für jede Bestellung
  • CustomerID: ID für den Kunden
  • OrderAmount: Der Betrag jeder Bestellung
  • OrderDate: Datum und Uhrzeit der Bestellung

Verfolgen Sie die Speicherzuordnung mit Tracemalloc

Jetzt erstellen wir ein Python-Skript zum Laden und Verarbeiten des Datensatzes. Wir werden auch Speicherzuordnungen verfolgen.

Zuerst definieren wir die Funktionen load_data und process_data, um Datensätze aus der CSV-Datei zu laden und zu verarbeiten:

# main.py
import pandas as pd

def load_data(file_path):
    print("Loading data...")
    df = pd.read_csv(file_path)
    return df

def process_data(df):
    print("Processing data...")
    df['DiscountedAmount'] = df['OrderAmount'] * 0.9  # Apply a 10% discount
    df['OrderYear'] = pd.to_datetime(df['OrderDate']).dt.year  # Extract the order year
    return df

Anschließend können wir mit der Verfolgung der Speicherzuordnung fortfahren, indem wir wie folgt vorgehen:

  • Initialisieren Sie die Speicherverfolgung mit tracemalloc.start().
  • Die Funktion load_data() liest die CSV-Datei in einen Datenrahmen. Nach diesem Schritt erstellen wir eine Momentaufnahme der Speichernutzung.
  • Die Funktion process_data() fügt dem Datenrahmen zwei neue Spalten hinzu: „DiscountedAmount“ und „OrderYear“. Nach der Bearbeitung machen wir einen weiteren Schnappschuss.
  • Wir vergleichen die beiden Snapshots, um Unterschiede bei der Speichernutzung zu ermitteln, und drucken die Zeilen mit dem höchsten Speicherverbrauch aus.
  • Drucken Sie dann die aktuelle und die Spitzenspeicherauslastung aus, um die Gesamtauswirkungen zu verstehen.

Hier ist der entsprechende Code:

import tracemalloc

def main():
    # Start tracing memory allocations
    tracemalloc.start()

    # Load data
    df = load_data('order_data.csv')

    # Take a snapshot
    snapshot1 = tracemalloc.take_snapshot()

    # Process data
    df = process_data(df)

    # Take another snapshot
    snapshot2 = tracemalloc.take_snapshot()

    # Compare snapshots
    top_stats = snapshot2.compare_to(snapshot1, 'lineno')

    print("[ Top memory-consuming lines ]")
    for stat in top_stats[:10]:
        print(stat)

    # Current and peak memory usage
    current, peak = tracemalloc.get_traced_memory()
    print(f"Current memory usage: {current / 1024 / 1024:.1f} MB")
    print(f"Peak usage: {peak / 1024 / 1024:.1f} MB")

    tracemalloc.stop()

if __name__ == "__main__":
    main()

Führen Sie nun das Python-Skript aus:

$ python3 main.py

Dadurch werden die Zeilen mit dem höchsten Speicherverbrauch sowie die aktuelle und maximale Speichernutzung ausgegeben:

Loading data...
Processing data...
[ Top 3 memory-consuming lines ]
/home/balapriya/trace_malloc/v1/lib/python3.11/site-packages/pandas/core/frame.py:12683: size=1172 KiB (+1172 KiB), count=4 (+4), average=293 KiB
/home/balapriya/trace_malloc/v1/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2354: size=781 KiB (+781 KiB), count=3 (+3), average=260 KiB
:123: size=34.6 KiB (+15.3 KiB), count=399 (+180), average=89 B
Current memory usage: 10.8 MB
Peak usage: 13.6 MB

Zusammenfassung

Die Verwendung von Tracemalloc zum Verfolgen der Speicherzuweisung hilft dabei, speicherintensive Vorgänge zu identifizieren und möglicherweise die Leistung mithilfe der Speicherverfolgung und der zurückgegebenen Statistiken zu optimieren.

Sie sollten sehen können, ob Sie effizientere Datenstrukturen und Verarbeitungsmethoden verwenden können, um die Speichernutzung zu minimieren. Bei Anwendungen mit langer Laufzeit können Sie Tracemalloc regelmäßig verwenden, um die Speichernutzung zu verfolgen. Allerdings können Sie Tracemalloc jederzeit in Verbindung mit anderen Profiling-Tools verwenden, um einen umfassenden Überblick über die Speichernutzung zu erhalten.

Wenn Sie daran interessiert sind, die Speicherprofilerstellung mit Memory-Profiler zu erlernen, lesen Sie Einführung in die Speicherprofilerstellung in Python.

Bala Priya C ist eine Entwicklerin und technische Redakteurin aus Indien. Sie arbeitet gerne an der Schnittstelle von Mathematik, Programmierung, Datenwissenschaft und Inhaltserstellung. Zu ihren Interessen- und Fachgebieten gehören DevOps, Datenwissenschaft und Verarbeitung natürlicher Sprache. Sie liebt es zu lesen, zu schreiben, zu programmieren und Kaffee zu trinken! Derzeit arbeitet sie daran, zu lernen und ihr Wissen mit der Entwickler-Community zu teilen, indem sie Tutorials, Anleitungen, Meinungsbeiträge und mehr verfasst. Bala erstellt außerdem ansprechende Ressourcenübersichten und Programmier-Tutorials.