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)
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}")
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)
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}")
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())
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())
Weitere ErweiterungenDie 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.