Bonjour à tous,
Il n'est pas rare d'être confronté, sur de petits projets, ou des besoins bien spécifiques, à un dilemme : que faire lorsqu'on a quelques données et/ou des besoins de requêtage très basiques ?
En effet, installer un SGBD pour un environnement mono utilisateur et y stocker deux tables de quelques dizaines de lignes qui ne servent qu'à afficher des données dans des combos... c'est un peu le marteau pilon pour ouvrir une noix.
Quant à stocker les données dans un fichier XML ou JSON... c'est pas la panacée en termes de performances, ça oblige à mettre en place des usines à gaz, on réécrit tout le fichier à chaque fois qu'on y fait une modification... Bref, la plaie.
Reste SQLLite, qui, je l'avoue, rend partiellement caduque ce topic, puisqu'il permet de bénéficier de la puissance d'un SGBD et du SQL sans en avoir la lourdeur (ou tout du moins, que partiellement).
Ca fait un bon moment que j'y pense : à l'époque de VB6, tout début année 2000, j'ai été bluffé par les performances d'un programme écrit avec les pieds qui lisait des structures directement dans un fichier.
Depuis cette époque, je me dis qu'il serait pas forcément idiot d'écrire une petite librairie qui permette de faire la même chose, afin de gérer simplement des données dans un fichier.
Depuis quelques temps, je découvre aussi le progiciel de gestion Divalto Infinity.
Même si la majeure partie du programme utilise maintenant SQL Server, certaines parties du programme continuent à utiliser des fichiers séquentiels indexés. D'après l'éditeur, c'est pas vraiment qu'il n'ont pas pris le temps d'effectuer la conversion... c'est avant tout parce que pour certaines partie du logiciel, le SGBD n'apporterait rien, ni en termes de performances, ni en termes de fonctionnalités.
Fort de tout ça, hier je me suis lancé, ça m'a empêché de dormir une partie de la nuit, et maintenant j'ai pondu une version 0.1 de ma librairie.
Alors je vous le dis tout de suite : niveau fonctionnalités, ça ne va pas chercher bien loin, et niveau performances... bah c'est optimisé avec les pieds.
Et pourtant, je suis tout simplement sidéré par les performances de l'outil.
Je vous laisse juger les résultats de mon programme de test qui permet de vérifier le bon fonctionnement de ma librairie...
Il s'agit ici d'insérer en deux fois 5 millions de personnes dans un ordre totalement aléatoire (instances d'une classe Person) dans le fichier "person.dat".
Cela représente un volume de plus de 800 Mo, sur un disque magnétique (vieux disque magnétique de portable recyclé), et ça dure un peu moins de 60 secondes (sisi).
Le programme génère ensuite une liste de 100 000 identifiants aléatoires de personnes à rechercher (il peut y avoir des doublons) puis les charge.
1 sur 2, il le remplace avec un nouveau nom et un nouveau prénom, et 1 sur 2 est tout simplement supprimé.
Et il fait tout ça en... 1,6 secondes !
Aussi bien générer 800 Mo de données (10 millions de lignes je vous le rappelle) en moins d'une minute, je suis assez content du résultat, mais pour le coup un SGBD pourrait arriver à suivre...Open file...
Clear file...
Generate names... (1/2)
Shuffle names... (1/2)
Insert names... (1/2)
5000000 person(s) added
Time to add 5000000 persons : 25896 ms
Average time per record : 51 ticks
Generate names... (2/2)
Shuffle names... (2/2)
Insert names... (2/2)
5000000 person(s) added
Time to add 5000000 persons : 28214 ms
Average time per record : 56 ticks
Insert on person...
Time to add 1 persons : 3636 ticks
There are 10000001 persons in the file
Generate a list of persons to find...
Search those persons and change even to Alfred E. Neuman or delete odd...
99758 person(s) found in 1663 ms
Average time per record : 166 ticks
The file contains 9950113 names
Autant retrouver près de 100 000 lignes, en modifier la moitié et supprimer l'autre moitié en 1,6 secondes... là, même sur un beau serveur (ce qui n'est pas le cas de mon PC) on va arriver à ces résultats avec un SGBD !
Bon, après, il faut relativiser... c'est du CRUD tout ce qu'il y a de plus basique, avec un seul index sur l'identifiant : pas question de rechercher une personne par son nom par exemple.
Et il n'y a pas de transaction non plus, ni d'accès concurrents possibles.
Mais bon, je me suis dit que tout de même, une lib .NET de moins d'à peine 100 lignes de code et simple d'utilisation pourrait intéresser du monde, comme alternative à un SGBD.
Le code source est accessible ici : https://github.com/SylvainDevidal/MagicFlatIndex
Le programme n'est pas finalisé du tout, et le README.md identifie un certain nombre de lacunes encore présentes (bouchage des trous, réorganisation/tri des données dans le fichier, etc.)
Tout commentaire est le bienvenu.
Edit du 18/04/2020 : Ajout d'une méthode de reconstruction de l'index en cas de perte du fichier ou de reprise après crash
Partager