Pandas Verarbeitung großer Dateien (chunksize)

Bei der Verarbeitung großer Datendateien reicht der Arbeitsspeicher möglicherweise nicht aus, um alle Daten auf einmal zu laden. Pandas bietet eine Funktion zum Lesen in Chunks, um Daten in Stapeln zu verarbeiten.


CSV in Chunks lesen

chunksize-Parameter

Beispiel

import pandas as pd
import io

# Großen Dateiinhalt simulieren (in der tatsächlichen Verwendung durch Dateipfad ersetzen)
data = """id,value
1,100
2,200
3,300
4,400
5,500
6,600
7,700
8,800
9,900
10,1000
"""


# chunksize verwenden, um in Chunks zu lesen
chunks = pd.read_csv(io.StringIO(data), chunksize=3)

print("Chunk-Verarbeitung:")
for i, chunk in enumerate(chunks):
    print(f"\n"Chunk {i+1}:")
    print(chunk)

Aggregationsverarbeitung

Beispiel

import pandas as pd
import io
import numpy as np

# Große Datei simulieren
data = "value\n" + "\n".join([str(i) for i in range(1, 1001)])

# Summe pro Chunk berechnen
total = 0
count = 0

for chunk in pd.read_csv(io.StringIO(data), chunksize=100):
    total += chunk["value"].sum()
    count += len(chunk)

print(f"Zeilen insgesamt: {count}")
print(f"Summe: {total}")
print(f"Durchschnitt: {total / count}")

Inkrementelle Verarbeitung

Filtern

Beispiel

import pandas as pd
import io

# Daten simulieren
data = """id,value,category
1,100,A
2,200,B
3,150,A
4,300,C
5,250,B
6,180,A
"""


# Daten mit bestimmten Bedingungen filtern
filtered_chunks = []

for chunk in pd.read_csv(io.StringIO(data), chunksize=2):
    filtered = chunk[chunk["category"] == "A"]
    if len(filtered) > 0:
        filtered_chunks.append(filtered)

result = pd.concat(filtered_chunks)
print("Filtern von category='A'-Daten:")
print(result)

Parallele Verarbeitung mit Multiprocessing

Beispiel

import pandas as pd
import io
from concurrent.futures import ProcessPoolExecutor

# Parallele Verarbeitung (geeignet für CPU-intensive Aufgaben)
def process_chunk(chunk):
    """Verarbeitet einen einzelnen Block"""
    return chunk["value"].sum()

# Daten simulieren
data = "value\n" + "\n".join([str(i) for i in range(1, 101)])

# Daten-Chunks vorbereiten
chunks = list(pd.read_csv(io.StringIO(data), chunksize=10))

# Serielle Verarbeitung
total = sum(process_chunk(chunk) for chunk in chunks)
print(f"Summe der seriellen Verarbeitung: {total}")

Verarbeitung großer JSON-Dateien

Beispiel

import pandas as pd
import json
import io

# Simuliere Daten im JSON-Lines-Format
jsonl_data = '\n'.join([
    json.dumps({"id": i, "value": i * 10})
    for i in range(1, 101)
])

# JSON Lines in Blöcken lesen
chunks = []
chunk_size = 20

for chunk in pd.read_json(io.StringIO(jsonl_data), lines=True, chunksize=chunk_size):
    chunks.append(chunk)
    if len(chunks) >= 3:  # Verarbeite nur die ersten 3 Blöcke als Beispiel
        break

result = pd.concat(chunks)
print(f"{len(result)} Datenzeilen gelesen")
print(result.head())

Die Verarbeitung in Blöcken kann den Speicherverbrauch erheblich reduzieren, aber sie erhöht die Verarbeitungszeit. Wähle eine angemessene Blockgröße, um Speicher- und Zeitaufwand auszugleichen.

Weitere Erweiterungen