- Récapitulatif des essais menés pour générer rapidement une base de test de grande taille
→ Le meilleur résultat actuel est de 33 secondes pour 100 millions de lignes (sur un MBP 2019)
- Boucle en code Python : 15 minutes pour 10 millions
→ En ajustant la taille des insertions par lot à 100 000 : réduit à 10 minutes
- Optimisation des réglages SQLite : désactivation de
journal_mode/synchronous, ajustement de la taille du cache, verrouillage exclusif
→ Version en boucle : 10 minutes pour 100 millions, version par lots : 8,5 minutes pour 100 millions
-
Passage à PyPy : la version par lots descend à 2,5 minutes pour 100 millions (3,5x plus rapide)
-
Réécriture en Rust : version en boucle + optimisations SQLite, 3 minutes pour 100 millions
→ Après passage aux prepared statements et à des insertions par lots de 50 lignes, 34,3 secondes pour 100 millions
→ Passage à une version multithread : 1 thread d’écriture, 4 threads de données. 32,37 secondes
- En passant le stockage de la base SQLite à
:memory:, gain de 2 secondes, soit 29 secondes
→ Il semble que le flush de 100 millions de lignes prenne 2 secondes
- Prochaines pistes à tester (pour atteindre 1 milliard par minute)
→ Faire du profiling
→ Tester une version multiprocess pour exploiter 4 cœurs
→ Écrire une version en Go puis l’exécuter avec le GC désactivé
→ Idée folle : apprendre le format de fichier SQLite et générer directement les données dans ce format
Aucun commentaire pour le moment.