So verarbeiten Sie große Datensätze in Python, auch wenn Sie Anfänger sindSo verarbeiten Sie große Datensätze in Python, auch wenn Sie Anfänger sind
Bild vom Autor

# Einführung

Die Arbeit mit großen Datensätzen in Python führt oft zu einem häufigen Drawback: Sie laden Ihre Daten mit Pandasund Ihr Programm wird langsamer oder stürzt vollständig ab. Dies geschieht normalerweise, weil Sie versuchen, alles gleichzeitig in den Speicher zu laden.

Die meisten Speicherprobleme haben ihren Ursprung in Wie Sie laden und verarbeiten Daten. Mit ein paar praktischen Techniken können Sie Datensätze verarbeiten, die viel größer sind als Ihr verfügbarer Speicher.

In diesem Artikel lernen Sie sieben Techniken für die effiziente Arbeit mit großen Datenmengen in Python kennen. Wir fangen einfach an und bauen dann auf, sodass Sie am Ende genau wissen, welcher Ansatz zu Ihrem Anwendungsfall passt.

🔗 Du findest die Code auf GitHub. Wenn Sie möchten, können Sie dies ausführen Beispieldatengenerator-Python-Skript um Beispiel-CSV-Dateien abzurufen und die Codeausschnitte zu verwenden, um sie zu verarbeiten.

# 1. Daten in Blöcken lesen

Der einsteigerfreundlichste Ansatz besteht darin, Ihre Daten in kleineren Teilen zu verarbeiten, anstatt alles auf einmal zu laden.

Stellen Sie sich ein Szenario vor, in dem Sie über einen großen Verkaufsdatensatz verfügen und den Gesamtumsatz ermitteln möchten. Der folgende Code demonstriert diesen Ansatz:

import pandas as pd

# Outline chunk measurement (variety of rows per chunk)
chunk_size = 100000
total_revenue = 0

# Learn and course of the file in chunks
for chunk in pd.read_csv('large_sales_data.csv', chunksize=chunk_size):
    # Course of every chunk
    total_revenue += chunk('income').sum()

print(f"Complete Income: ${total_revenue:,.2f}")

Anstatt alle 10 Millionen Zeilen auf einmal zu laden, laden wir 100.000 Zeilen gleichzeitig. Wir berechnen die Summe für jeden Brocken und addieren sie zu unserer laufenden Summe. Ihr RAM fasst immer nur 100.000 Zeilen, egal wie groß die Datei ist.

Wann ist dies zu verwenden?: Wenn Sie Aggregationen (Summe, Anzahl, Durchschnitt) oder Filtervorgänge für große Dateien durchführen müssen.

# 2. Verwenden Sie nur bestimmte Spalten

Oft benötigen Sie nicht jede Spalte in Ihrem Datensatz. Wenn Sie nur das laden, was Sie brauchen, kann die Speichernutzung erheblich reduziert werden.

Angenommen, Sie analysieren Kundendaten, benötigen jedoch nur das Alter und den Kaufbetrag und nicht die zahlreichen anderen Spalten:

import pandas as pd

# Solely load the columns you really need
columns_to_use = ('customer_id', 'age', 'purchase_amount')

df = pd.read_csv('prospects.csv', usecols=columns_to_use)

# Now work with a a lot lighter dataframe
average_purchase = df.groupby('age')('purchase_amount').imply()
print(average_purchase)

Durch Angabe usecolslädt Pandas nur diese drei Spalten in den Speicher. Wenn Ihre Originaldatei 50 Spalten hätte, haben Sie Ihren Speicherverbrauch gerade um etwa 94 % reduziert.

Wann ist dies zu verwenden?: Wenn Sie vor dem Laden der Daten genau wissen, welche Spalten Sie benötigen.

# 3. Datentypen optimieren

Standardmäßig verbraucht Pandas möglicherweise mehr Speicher als nötig. Eine Spalte mit Ganzzahlen könnte als 64-Bit gespeichert werden, während 8-Bit intestine funktionieren würde.

Wenn Sie beispielsweise einen Datensatz mit Produktbewertungen (1–5 Sterne) und Benutzer-IDs laden:

import pandas as pd

# First, let's have a look at the default reminiscence utilization
df = pd.read_csv('scores.csv')
print("Default reminiscence utilization:")
print(df.memory_usage(deep=True))

# Now optimize the information varieties
df('ranking') = df('ranking').astype('int8')  # Scores are 1-5, so int8 is sufficient
df('user_id') = df('user_id').astype('int32')  # Assuming person IDs slot in int32

print("nOptimized reminiscence utilization:")
print(df.memory_usage(deep=True))

Durch Umrechnung der Bewertungsspalte vom Wahrscheinlichen int64 (8 Bytes professional Zahl) bis int8 (1 Byte professional Zahl) erreichen wir eine 8-fache Speicherreduzierung für diese Spalte.

Zu den gängigen Konvertierungen gehören:

  • int64int8, int16oder int32 (abhängig vom Zahlenbereich).
  • float64float32 (wenn Sie keine excessive Präzision benötigen).
  • objectclass (für Spalten mit wiederholten Werten).

# 4. Verwenden Sie kategoriale Datentypen

Wenn eine Spalte wiederholte Textwerte enthält (wie Ländernamen oder Produktkategorien), speichert Pandas jeden Wert separat. Der class dtype speichert die eindeutigen Werte einmal und verwendet effiziente Codes, um darauf zu verweisen.

Angenommen, Sie arbeiten mit einer Produktinventardatei, in der die Kategoriespalte nur 20 eindeutige Werte enthält, diese sich jedoch in allen Zeilen im Datensatz wiederholen:

import pandas as pd

df = pd.read_csv('merchandise.csv')

# Examine reminiscence earlier than conversion
print(f"Earlier than: {df('class').memory_usage(deep=True) / 1024**2:.2f} MB")

# Convert to class
df('class') = df('class').astype('class')

# Examine reminiscence after conversion
print(f"After: {df('class').memory_usage(deep=True) / 1024**2:.2f} MB")

# It nonetheless works like regular textual content
print(df('class').value_counts())

Diese Konvertierung kann die Speichernutzung für Spalten mit geringer Kardinalität (wenige eindeutige Werte) erheblich reduzieren. Die Funktion der Spalte ähnelt weiterhin den Standardtextdaten: Sie können wie gewohnt filtern, gruppieren und sortieren.

Wann ist dies zu verwenden?: Für jede Textspalte, in der sich Werte häufig wiederholen (Kategorien, Staaten, Länder, Abteilungen und dergleichen).

# 5. Filtern Sie beim Lesen

Manchmal wissen Sie, dass Sie nur eine Teilmenge von Zeilen benötigen. Anstatt alles zu laden und dann zu filtern, können Sie während des Ladevorgangs filtern.

Wenn Sie beispielsweise nur Transaktionen aus dem Jahr 2024 interessieren:

import pandas as pd

# Learn in chunks and filter
chunk_size = 100000
filtered_chunks = ()

for chunk in pd.read_csv('transactions.csv', chunksize=chunk_size):
    # Filter every chunk earlier than storing it
    filtered = chunk(chunk('12 months') == 2024)
    filtered_chunks.append(filtered)

# Mix the filtered chunks
df_2024 = pd.concat(filtered_chunks, ignore_index=True)

print(f"Loaded {len(df_2024)} rows from 2024")

Wir kombinieren Chunking mit Filtern. Jeder Block wird gefiltert, bevor er zu unserer Liste hinzugefügt wird, sodass wir nie den gesamten Datensatz im Speicher behalten, sondern nur die Zeilen, die wir tatsächlich benötigen.

Wann ist dies zu verwenden?: Wenn Sie basierend auf einer Bedingung nur eine Teilmenge von Zeilen benötigen.

# 6. Verwenden Sie Dask für die Parallelverarbeitung

Für Datensätze, die wirklich umfangreich sind, Dask stellt eine Pandas-ähnliche API bereit, übernimmt jedoch die gesamte Chunking- und Parallelverarbeitung automatisch.

So würden Sie den Durchschnitt einer Spalte in einem großen Datensatz berechnen:

import dask.dataframe as dd

# Learn with Dask (it handles chunking mechanically)
df = dd.read_csv('huge_dataset.csv')

# Operations look similar to pandas
outcome = df('gross sales').imply()

# Dask is lazy - compute() really executes the calculation
average_sales = outcome.compute()

print(f"Common Gross sales: ${average_sales:,.2f}")

Dask lädt nicht die gesamte Datei in den Speicher. Stattdessen erstellt es einen Plan für die Verarbeitung der Daten in Blöcken und führt diesen Plan aus, wenn Sie ihn aufrufen .compute(). Es können sogar mehrere CPU-Kerne verwendet werden, um die Berechnung zu beschleunigen.

Wann ist dies zu verwenden?: Wenn Ihr Datensatz zu groß für Pandas ist, selbst mit Chunking, oder wenn Sie eine parallele Verarbeitung wünschen, ohne komplexen Code zu schreiben.

# 7. Proben Sie Ihre Daten zur Erkundung

Wenn Sie nur Code erkunden oder testen, benötigen Sie nicht den vollständigen Datensatz. Laden Sie zuerst eine Probe.

Angenommen, Sie erstellen ein Modell für maschinelles Lernen und möchten Ihre Vorverarbeitungspipeline testen. Sie können Ihren Datensatz wie gezeigt testen:

import pandas as pd

# Learn simply the primary 50,000 rows
df_sample = pd.read_csv('huge_dataset.csv', nrows=50000)

# Or learn a random pattern utilizing skiprows
import random
skip_rows = lambda x: x > 0 and random.random() > 0.01  # Preserve ~1% of rows

df_random_sample = pd.read_csv('huge_dataset.csv', skiprows=skip_rows)

print(f"Pattern measurement: {len(df_random_sample)} rows")

Der erste Ansatz lädt die ersten N Zeilen, was für eine schnelle Erkundung geeignet ist. Beim zweiten Ansatz werden zufällig Zeilen in der gesamten Datei abgetastet. Dies eignet sich besser für statistische Analysen oder wenn die Datei so sortiert ist, dass die obersten Zeilen nicht repräsentativ sind.

Wann ist dies zu verwenden?: Während der Entwicklung, beim Testen oder bei der explorativen Analyse, bevor Sie Ihren Code für den gesamten Datensatz ausführen.

# Abschluss

Der Umgang mit großen Datensätzen erfordert keine Expertenkenntnisse. Hier ist eine kurze Zusammenfassung der Techniken, die wir besprochen haben:

Technik Wann sollte man es verwenden?
Chunking

Für Aggregationen, Filterung und Verarbeitung von Daten reicht der Arbeitsspeicher nicht aus.

Spaltenauswahl

Wenn Sie nur wenige Spalten aus einem umfangreichen Datensatz benötigen.

Datentypoptimierung

Stets; Tun Sie dies nach dem Laden, um Speicherplatz zu sparen.

Kategoriale Typen

Für Textspalten mit wiederholten Werten (Kategorien, Zustände usw.).

Filtern Sie beim Lesen

Wenn Sie nur eine Teilmenge von Zeilen benötigen.

Dask

Für sehr große Datensätze oder wenn Sie eine parallele Verarbeitung wünschen.

Probenahme

Während der Entwicklung und Erforschung.

Der erste Schritt besteht darin, sowohl Ihre Daten als auch Ihre Aufgabe zu kennen. In den meisten Fällen reicht eine Kombination aus Chunking und intelligenter Spaltenauswahl aus, um 90 % des Ziels zu erreichen.

Wenn Ihre Anforderungen wachsen, wechseln Sie zu fortschrittlicheren Instruments wie Dask oder erwägen Sie die Konvertierung Ihrer Daten in effizientere Dateiformate wie Parkett oder HDF5.

Beginnen Sie nun mit der Arbeit mit diesen riesigen Datensätzen. Viel Spaß beim Analysieren!

Bala Priya C ist ein Entwickler und technischer Redakteur 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-Neighborhood zu teilen, indem sie Tutorials, Anleitungen, Meinungsbeiträge und mehr verfasst. Bala erstellt außerdem ansprechende Ressourcenübersichten und Programmier-Tutorials.



Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert