Le dĂ©fi du milliard de lignes đ±
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 !
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 --sdaSi 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.

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.

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:watchSi 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.
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();
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.
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();
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.

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.

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 !