Rust für Big Data: Millionen von Zeilen schneller verarbeiten als Python

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum Rust der neue König der Big-Data-Verarbeitung ist?

\n\n

Haben Sie schon einmal 20 Minuten gewartet, bis ein Python-Skript eine 10-Gigabyte-CSV-Datei verarbeitet hat? Und dann noch 10 Minuten, weil der Speicher ausgegangen ist und das System in den Swap gegangen ist? Kommt Ihnen bekannt vor?

\n\n

Die Welt der Big Data gehörte lange Zeit Python und seinem Ökosystem: Pandas, NumPy, Dask. Aber es gibt ein Problem – Python ist langsam. Sehr langsam. Und wenn Daten in Terabyte gemessen werden, wird jede zusätzliche Millisekunde zu stundenlangen Ausfallzeiten.

\n\n

Hier kommt Rust ins Spiel. Eine systemnahe Sprache, die die Leistung von C++ und Speichersicherheit bietet, aber mit einer Syntax, die (Spoiler) durchaus liebenswert ist. Und ja, sie ist perfekt für die Verarbeitung großer Datenmengen geeignet.

\n\n

In diesem Artikel werden wir untersuchen, wie Rust es ermöglicht, riesige Datenmengen schneller, sicherer und mit geringerem Speicherverbrauch zu verarbeiten. Keine Magie – nur Code und Messungen.

\n\n

Rust vs. Python für Big Data: Was steckt dahinter?

\n\n

Kommen wir gleich zu den Zahlen. Hier ist ein einfacher Test: Eine 500 MB große CSV-Datei lesen, Zeilen nach einer Bedingung filtern und die Summe berechnen.

\n\n\n\n\n\n\n
ParameterPython (Pandas)Rust (Polars)
Ausführungszeit12,4 Sekunden0,8 Sekunden
Spitzen-RAM-Verbrauch2,1 GB380 MB
Anzahl der Zeilen5 Millionen5 Millionen
\n\n

15-mal schneller und 5-mal speicherschonender. Und das ist noch nicht die Grenze. Rust gibt Ihnen die Kontrolle über jedes Byte, über jede Speicherzuweisung. Es verzeiht keine Fehler, liefert aber die Geschwindigkeit, die Python nie erreichen wird.

\n\n

Rust-Werkzeuge für Big Data

\n\n

Bevor wir Code schreiben, schauen wir uns an, was im Arsenal ist. Rust steht nicht still – das Ökosystem für die Datenverarbeitung wächst aktiv.

\n\n

Wichtige Bibliotheken

\n
    \n
  • Polars – das Pandas-Äquivalent, aber in Rust. Unterstützt Lazy-Auswertung, parallele Verarbeitung und arbeitet mit Daten, die nicht in den Speicher passen.
  • \n
  • Apache Arrow – ein spaltenbasiertes Datenformat, das den Datenaustausch zwischen verschiedenen Sprachen ohne Kopieren ermöglicht.
  • \n
  • DataFusion – eine SQL-Engine in Rust, die Abfragen direkt über Arrow-Daten ausführen kann.
  • \n
  • rayon – eine Bibliothek für parallele Iterationen. Ermöglicht die einfache Parallelisierung jeder Verarbeitung.
  • \n
  • csv – ein schneller CSV-Parser mit minimalen Speicherzuweisungen.
  • \n
  • serde – Serialisierung/Deserialisierung. Unverzichtbar für die Arbeit mit JSON, YAML, TOML.
  • \n
\n\n

Wir werden Polars und rayon verwenden, da dies der De-facto-Standard für die Big-Data-Verarbeitung mit Rust ist.

\n\n

Praktisches Beispiel: Verarbeitung von Webserver-Logs

\n\n

Stellen Sie sich vor, Sie haben 100 Millionen Nginx-Logeinträge. Sie müssen:

\n
    \n
  1. Nur 5xx-Fehler herausfiltern
  2. \n
  3. Nach IP-Adresse gruppieren
  4. \n
  5. Die Anzahl der Fehler pro IP zählen
  6. \n
  7. Die Top-10 der Angreifer anzeigen
  8. \n
\n\n

Mit Python und Pandas würde dies etwa 2-3 Minuten dauern und den gesamten Arbeitsspeicher fressen. Mit Rust – 15-20 Sekunden.

\n\n

Datenstruktur

\n

Angenommen, jeder Logeintrag sieht so aus:

\n
192.168.1.1 - - [10/Oct/2023:13:55:36 +0000] "GET /api/data HTTP/1.1" 500 1234 "-" "Mozilla/5.0"
\n\n

Wir müssen die Zeile parsen, die IP und den Statuscode extrahieren. In Rust geschieht dies über einen eigenen Strukturtyp:

\n\n
use serde::Deserialize;\n\n#[derive(Debug, Deserialize)]\nstruct LogEntry {\n    ip: String,\n    status_code: u16,\n    method: String,\n    path: String,\n    user_agent: String,\n}
\n\n

CSV-Parsing mit Polars

\n

Polars ist der Grund, warum es sich lohnt, Rust auszuprobieren

Blogs

Buchempfehlungen