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.
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.
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.
engine="pyarrow" quand l’environnement le permet : lecture plus rapide, types plus sains.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.