Skip to Content
Projets de donnĂ©esLe dĂ©fi du milliard de lignes đŸ˜±

Le dĂ©fi du milliard de lignes đŸ˜±

Par Nael Shiab

DerniĂšre mise Ă  jour le

Bienvenue dans ce nouveau projet oĂč nous allons exploiter un fichier CSV contenant un milliard de lignes. Oui, UN MILLIARD !

Il s’agit d’un dĂ©fi trĂšs amusant créé par Gunnar Morling .

Votre mission, si vous l’acceptez, est en apparence simple : Ă©crire un programme en Java pour rĂ©cupĂ©rer les valeurs de tempĂ©rature Ă  partir d’un fichier texte et calculer les tempĂ©ratures minimale, moyenne et maximale par station mĂ©tĂ©o. Il y a juste un petit dĂ©tail : le fichier contient 1 000 000 000 de lignes !

Au lieu d’utiliser un programme en Java, nous allons bien sĂ»r utiliser TypeScript, avec la librairie Simple Data Analysis (SDA) que j’ai créée (donnez-lui un ⭐ ). C’est une excellente occasion de tester sa puissance !

Si vous ĂȘtes bloquĂ© Ă  un moment donnĂ© dans ce projet, il peut ĂȘtre utile de revoir les leçons prĂ©cĂ©dentes du chapitre 3, particuliĂšrement Installation et DonnĂ©es tabulaires, qui expliquent les bases de SDA.

C’est parti !

Vous voulez ĂȘtre prĂ©venu quand de nouvelles leçons sont publiĂ©es ? Abonnez-vous Ă  l'infolettre ✉ et donnez une ⭐ au cours sur GitHub pour me garder motivé ! Cliquez ici pour me contacter.

Installation

Créez un nouveau dossier vide à un endroit pratique sur votre ordinateur et ouvrez-le dans VS Code. Ouvrez ensuite le terminal dans VS Code.

Nous utiliserons @nshiab/setup-data-project, une librairie que j’ai créée pour installer les librairies et prĂ©parer tous les fichiers et rĂ©glages nĂ©cessaires Ă  un projet. ExĂ©cutez cette commande dans le terminal :

npx @nshiab/setup-data-project --sda

Si on vous demande de confirmer l’installation de la librairie, tapez y et appuyez sur EntrĂ©e.

L’option --sda sĂ©lectionne automatiquement la librairie simple-data-analysis Ă  installer.

Une fois que le terminal affiche You are all set!, ouvrez sda/main.ts. Vous y trouverez du code de départ.

VS Code montrant les fichiers du projet et le message de fin de configuration.

Si VS Code vous propose d’installer l’extension recommandĂ©e Oxc, cliquez sur Install. Elle aide Ă  formater votre code et Ă  repĂ©rer des problĂšmes potentiels pendant que vous travaillez.

VS Code recommandant l'extension Oxc, avec une flĂšche pointant vers Install.

Nous sommes maintenant prĂȘts Ă  surveiller sda/main.ts. ExĂ©cutez la commande ci-dessous. Chaque fois que vous enregistrez le fichier, votre code sera automatiquement formatĂ©, vĂ©rifiĂ© et exĂ©cutĂ© :

npm run sda:watch

Si vous devez arrĂȘter la surveillance, cliquez dans le terminal et appuyez sur Ctrl+C sur Mac ou Windows.

Gardez la surveillance active pendant ce projet.

Les données

Dans le dĂ©fi original, vous devez copier un rĂ©pertoire GitHub et exĂ©cuter un script pour gĂ©nĂ©rer un fichier CSV contenant 1 milliard de lignes. Je l’ai gĂ©nĂ©rĂ© pour vous et j’ai tĂ©lĂ©versĂ© une copie appartenant au cours sur Google Drive.

Téléchargez les données ici . Cela peut prendre quelques minutes car le fichier fait environ 4 Go.

Ensuite, placez-le dans votre dossier sda/data et décompressez-le. La version décompressée du fichier CSV fait environ 13 Go.

Pour charger les données, ajoutez ce code dans sda/main.ts. Selon votre ordinateur, cela peut prendre de quelques secondes à quelques minutes.

sda/main.ts
import { SimpleDB } from "@nshiab/simple-data-analysis"; const sdb = new SimpleDB({ logDuration: true }); await sdb .newTable() .loadData("sda/data/measurements.csv") .log(); await sdb.close();

VS Code montrant measurements.csv chargé dans SDA, avec un milliard de lignes et les dix premiÚres valeurs de ville et de température affichées dans le terminal.

FĂ©licitations ! Vous venez de charger 1 000 000 000 de lignes de donnĂ©es ! Comme vous pouvez le voir, cela prend environ huit secondes sur mon M4 Max, ce qui est trĂšs impressionnant pour un fichier CSV de cette taille. đŸ„ł

Selon la RAM disponible sur votre ordinateur, vous pourriez voir un dossier .tmp apparaßtre dans votre projet. Si les données sont plus volumineuses que votre RAM, ce dossier sera utilisé pour traiter toutes les données en stockant des morceaux prétraités.

Ce dossier .tmp peut devenir assez volumineux. Mais ne vous inquiétez pas : lorsque vous configurez un projet avec @nshiab/setup-data-project, il est automatiquement ajouté à .gitignore afin que vous ne le mettiez pas en ligne par erreur sur GitHub ou ailleurs.

💡

Vous pouvez supprimer .tmp manuellement, mĂȘme si je ne le fais gĂ©nĂ©ralement pas. La commande npm run clean le supprime aussi, mais attention : elle supprime Ă©galement toutes les donnĂ©es mises en cache dans .sda-cache.

Le défi

Comme vous pouvez le voir ci-dessus, les données sont simplement une liste de villes avec des températures.

Maintenant, le dĂ©fi est de calculer les tempĂ©ratures minimale, moyenne et maximale par ville. Les rĂ©sultats doivent Ă©galement ĂȘtre triĂ©s par ordre alphabĂ©tique des villes.

Avec SDA, c’est trĂšs facile. Nous devons appeler une seule mĂ©thode, summarize, pour effectuer les calculs. Nous n’avons mĂȘme pas besoin de trier les lignes manuellement, car summarize le fait par dĂ©faut.

sda/main.ts
import { SimpleDB } from "@nshiab/simple-data-analysis"; const sdb = new SimpleDB({ logDuration: true }); await sdb .newTable() .loadData("sda/data/measurements.csv") .summarize({ columns: "temp", by: "city", stats: ["min", "mean", "max"], }) .log(); await sdb.close();

VS Code montrant les températures minimale, moyenne et maximale par ville aprÚs avoir résumé un milliard de lignes, avec 413 villes au total.

Sur mon ordinateur, ce code s’exĂ©cute encore plus rapidement que le simple chargement du fichier CSV, car la table finale est beaucoup plus petite que la table complĂšte d’un milliard de lignes. Tout est traitĂ© Ă  la volĂ©e, ce qui est assez incroyable. 🚀

Mais
 comment ?

Bien que SDA soit une librairie TypeScript, elle utilise sous le capot DuckDB , un systĂšme de base de donnĂ©es trĂšs rapide Ă©crit en C++. Lorsque vous utilisez des mĂ©thodes comme loadData ou summarize, SDA traduit tout en SQL et demande Ă  DuckDB de l’exĂ©cuter.

Pour comparer SDA Ă  d’autres options populaires, dont DuckDB, j’ai effectuĂ© quelques tests sur mon MacBook Pro M4 Max, comme dĂ©crit ci-dessous.

Données tabulaires

Pour les donnĂ©es tabulaires, j’ai effectuĂ© un test avec les donnĂ©es climatiques canadiennes ajustĂ©es et homogĂ©nĂ©isĂ©es , qui contiennent plus de 22 millions de lignes. Entre autres Ă©tapes, chaque option a calculĂ© la tempĂ©rature moyenne par station et par dĂ©cennie. SDA a effectivement Ă©tĂ© extrĂȘmement rapide par rapport aux autres options.

Un graphique comparant la durée moyenne de flux de travail tabulaires avec SDA, DuckDB, pandas et le tidyverse.

Données géospatiales

Pour les donnĂ©es gĂ©ospatiales, j’ai utilisĂ© le jeu de donnĂ©es regroupant tous les arbres publics de MontrĂ©al (335K). Le principal calcul consistait Ă  compter le nombre d’arbres dans chacun des quartiers de la ville. LĂ  encore, SDA a Ă©tĂ© une solution trĂšs rapide.

Un graphique comparant la durée moyenne de flux de travail géospatiaux avec SDA, DuckDB, GeoPandas et sf.

Les tests de mémoire racontent une histoire semblable. Vous pouvez consulter la méthodologie, le code et les résultats les plus récents dans le répertoire de Simple Data Analysis .

Conclusion

Voilà, c’est tout ! J’espùre que ce projet vous a convaincu de la performance de la librairie Simple Data Analysis.

Plus rien ne vous empĂȘche d’analyser des ensembles de donnĂ©es massifs avec TypeScript maintenant ! 💃đŸ•ș

Poursuivez avec DonnĂ©es tabulaires ou Visualiser des donnĂ©es au chapitre 3 pour dĂ©couvrir d’autres façons d’utiliser SDA !

Vous avez aimé ? Vous voulez ĂȘtre prĂ©venu quand de nouvelles leçons sont publiĂ©es ? Abonnez-vous Ă  l'infolettre ✉ et donnez une ⭐ au cours sur GitHub pour me garder motivé ! Contactez-moi si vous avez des questions.