Comment lisez-vous un CSV trop gros pour la mémoire ?

Questions d’entrevue Python et Pandas

Seniorpandas

Ce que vous ne faites pas

pd.read_csv("export.csv") sur un fichier plus gros que la RAM. L’inférence de schéma lit (souvent deux fois), typifie mal, et vous découvrez le MemoryError après trois minutes. En entretien senior, la première phrase est : je ne charge pas ce que je n’utiliserai pas, et je ne laisse pas Pandas inventer les types.

Trois leviers, dans cet ordre

usecols. La plupart des exports ont quarante colonnes pour cinq utiles. Chaque colonne object évitée est de la RAM rendue.

dtype (et parse_dates). Un dictionnaire explicite. Pas low_memory=False comme stratégie — cette option augmente souvent la mémoire pour unifier les types. Si une colonne ne tient pas dans le type déclaré, vous voulez que la lecture échoue, pas qu’elle bascule en object.

chunksize. Un itérateur de DataFrames. Vous agrégez au fil de l’eau, vous ne concaténez pas « pour retrouver un gros DataFrame » — ce serait reconstituer le problème.

python
total = 0
for chunk in pd.read_csv(
    "export.csv",
    usecols=["date", "pays", "montant"],
    dtype={"pays": "category", "montant": "float64"},
    parse_dates=["date"],
    chunksize=200_000,
):
    total += chunk.groupby("pays", observed=True)["montant"].sum()

revenu = total.groupby(level=0).sum()

Les category par chunk ont des modalités locales : un concat naïf casse le dtype. D’où l’agrégation dans la boucle, ou une liste de modalités connue à l’avance.

Autres sorties, à citer sans s’y perdre

  • engine="pyarrow" quand l’environnement le permet : lecture plus rapide, types plus sains.
  • Ne pas rester en CSV. Convertir une fois vers Parquet, puis travailler colonnes et row groups. C’est souvent la vraie réponse « gros fichier quotidien ».
  • Filtrer à la source — requête SQL, export restreint — plutôt que d’apprendre à Pandas à avaler un dump.

Ce que l’intervieweur veut

Une méthode : mesurer la taille et les colonnes (nrows sur un échantillon, usecols d’un en-tête), fixer le schéma, n’agréger que ce qui tient. Pas « j’augmente la RAM de la machine », qui est le dernier levier et le moins intéressant.

Toutes les questions Python et Pandas