Traitement de gros fichiers avec Pandas (chunksize)

Lors du traitement de fichiers de données volumineux, la mémoire peut être insuffisante pour charger toutes les données en une seule fois. Pandas propose une fonctionnalité de lecture par blocs pour traiter les données par lots.


Lire un CSV par blocs

paramètre chunksize

Exemple

import pandas as pd
import io

# Simuler le contenu d'un fichier volumineux (remplacer par le chemin du fichier en utilisation réelle)
data = """id,value
1,100
2,200
3,300
4,400
5,500
6,600
7,700
8,800
9,900
10,1000
"""


# Utiliser chunksize pour lire par blocs
chunks = pd.read_csv(io.StringIO(data), chunksize=3)

print("Traitement des blocs :")
for i, chunk in enumerate(chunks):
    print(f"\n"Bloc {i+1} :")
    print(chunk)

Traitement d'agrégation

Exemple

import pandas as pd
import io
import numpy as np

# Simuler un fichier volumineux
data = "value\n" + "\n".join([str(i) for i in range(1, 1001)])

# Calculer la somme par bloc
total = 0
count = 0

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

print(f"Nombre total de lignes : {count}")
print(f"Somme : {total}")
print(f"Moyenne : {total / count}")

Traitement incrémental

Filtrage

Exemple

import pandas as pd
import io

# Simuler des données
data = """id,value,category
1,100,A
2,200,B
3,150,A
4,300,C
5,250,B
6,180,A
"""


# Filtrer les données avec des conditions spécifiques
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("Filtrage des données de catégorie='A':")
print(result)

Traitement parallèle multiprocessing

Exemple

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

# Traitement parallèle (adapté aux tâches intensives en CPU)
def process_chunk(chunk):
    """Traite un seul bloc"""
    return chunk["value"].sum()

# Simuler des données
data = "value\n" + "\n".join([str(i) for i in range(1, 101)])

# Préparer les blocs de données
chunks = list(pd.read_csv(io.StringIO(data), chunksize=10))

# Traitement séquentiel
total = sum(process_chunk(chunk) for chunk in chunks)
print(f"Somme du traitement séquentiel : {total}")

Traitement de fichiers JSON volumineux

Exemple

import pandas as pd
import json
import io

# Simuler des données au format JSON Lines
jsonl_data = '\n'.join([
    json.dumps({"id": i, "value": i * 10})
    for i in range(1, 101)
])

# Lire JSON Lines par blocs
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:  # Ne traiter que les 3 premiers blocs à titre d'exemple
        break

result = pd.concat(chunks)
print(f"Lecture de {len(result)} lignes de données")
print(result.head())

Le traitement par blocs peut réduire considérablement l'utilisation de la mémoire, mais il augmentera le temps de traitement. Choisissez une taille de bloc raisonnable pour équilibrer la mémoire et le temps.

Autres extensions