veilletech.fr
13 sept. Feed du jour
#05 DUCKDB Article

La falaise de Pandas vous vend un cluster

Le cluster que vous évitez coûte moins cher que celui que vous provisionnez.

La thèse n'est pas que Pandas est lent, mais que sa falaise mémoire pousse vers un système distribué bien avant que le volume le justifie. L'auteur s'appuie sur le papier « Why TPC is not enough » publié par Amazon en 2024 sur son parc Redshift : environ 95 % des tables y contiennent moins de 100 Go. Entre la falaise et l'endroit où un cluster devient nécessaire, Polars et DuckDB tiennent sur une seule machine.

3 min de lectureintermédiairevidéo 1:13
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. Combien de Big Data existe réellement
  3. La mesure
  4. Pourquoi l'écart est structurel
  5. À retenir

Ce qui se passe

Le parcours est toujours le même : Excel, puis Pandas vers le gigaoctet, qui tient jusqu'à quelques dizaines de gigaoctets — et là, la mémoire sature. Le réflexe suivant est de passer à Spark, Databricks, Snowflake ou Dask.

L'argument d'Eddie Atkinson n'est pas que Pandas est lent. C'est que sa falaise arrive bien avant le point où un système distribué devient nécessaire, et que l'intervalle entre les deux est large.

Combien de Big Data existe réellement

Amazon a publié en 2024 un papier intitulé Why TPC is not enough: An analysis of the Amazon Redshift fleet, avec les statistiques de son parc : durées de requêtes et tailles de tables. En posant deux hypothèses — une ligne à 1 Ko, et des clusters de 10 machines avalant 8 Go/s depuis S3 —, l'auteur en tire :

Les hypothèses sont assumées, et le calcul est détaillé dans l'article. Même en prenant 10 Ko par ligne, le seuil monte à 1 To — loin du territoire où un cluster se justifie.

La mesure

Le 1 Billion Row Challenge — min, moyenne et max sur un CSV d'un milliard de lignes — sur une instance AWS m7a.8xlarge, 32 cœurs, 128 Go, Debian 12. Deux itérations de préchauffe, 30 répétitions, métriques relevées toutes les 50 ms avec psutil :

Bibliothèque Durée médiane CPU max Mémoire max (USS)
Pandas 4 min 28 s 113,0 % 38,12 Go
Polars 5,04 s 3202,60 % 18,02 Go
DuckDB 5,19 s 3174,64 % 1,93 Go

La meilleure implémentation Java du concours tournait en 1,5 s : les deux outils en sont à portée, sans réglage.

Sur un portable — Framework 13, i5-1135G7, 8 cœurs, 16 Go — l'écart devient brutal : Pandas met 12 min 15 s et réclame 21,02 Go de swap, contre 39 s pour Polars (35,85 Mo de swap) et 47 s pour DuckDB.

Deuxième jeu de données, les trajets de taxis new-yorkais (~3 Go de Parquet) :

Approche Durée médiane Mémoire max (USS)
Pandas seul 41,88 s 14,52 Go
DuckDB lit, Pandas calcule 28,39 s 14,79 Go
Pandas lit, DuckDB calcule 29,25 s 12,39 Go
DuckDB seul 21,70 s 216,76 Mo

Dès que Pandas entre dans la chaîne, la mémoire grimpe.

Pourquoi l'écart est structurel

Polars et DuckDB construisent un plan de requête avant d'exécuter. scan_csv est paresseux, .collect(new_streaming=True) déclenche le pipeline, et .explain(streaming=True) affiche le plan optimisé — avec predicate pushdown, donc les filtres appliqués avant l'agrégation. DuckDB fait la même chose en SQL, y compris sur un objet Python en mémoire.

Pandas, lui, exécute chaque étape de façon séquentielle et immédiate : il charge tout le jeu de données, groupe, puis agrège.

À retenir

L'auteur liste lui-même les raisons de ne pas le suivre : le coût de migration peut être trop élevé dans un écosystème très intégré à Pandas, et Pandas s'améliore. Le choix entre Polars et DuckDB dépend du profil — les ingénieurs data penchent vers SQL, les développeurs vers Polars.

Ce qu'il faut éviter, en revanche, est clair : prendre un système distribué et sa complexité parce que Pandas rame, alors que la probabilité d'en avoir réellement besoin est faible. Avant le prochain cluster, mesurez ce que donne un scan paresseux sur votre plus grosse table.