Bonjour, Dans mon projet professionnel nous avons une application C++ qui collecte des données et événements chaque seconde et qui enregistre le tout dans une base de données, ici c’est SQLite 3 qui est utilisé. Une base de données représente une journée de ces données, à minuit on change de fichier et on compresse l’ancien.
Cependant la mémoire de masse est un eMMC qui a des capacités en écriture assez faibles et n’est pas très très fiable. Nous souhaitons donc réduire au maximum les opérations d’écriture, idéalement une fois par tranche de 15 minutes. On considère que la perte de données de cette ordre de grandeur n’est pas un problème.
La solution retenue par mon prédécesseur est d’ouvrir la base de données SQLite avec les pragma suivants :
PRAGMA temp_store=MEMORY;
PRAGMA journal_mode=WAL;
PRAGMA wal_autocheckpoint=0;
Ce qui permet d’avoir la journalisation en mémoire et de désactiver la sauvegarde automatique dans le fichier.
Puis chaque table est en fait triplée lors de l’ouverture, la table du fichier nommée data
reçoit ses copains data_trash
et data_event
qui sont des tables vides temporaires à l’ouverture. Ces deux nouvelles tables sont donc en mémoire et pas dans le fichier.
L’idée est que chaque suppression est enregistrée dans data_trash
et chaque ajout dans data_event
avant (toutes les 15 minutes) de synchroniser manuellement ce qui s’est passé dans data_trash
et data_event
dans data
lui même. À ce moment là ces deux tables temporaires sont vidées et on recommence.
La mécanique fonctionne plutôt bien et est assez fiable. Du moins de ce que nous avons pu mesurer et tester en pratique. Mais niveau conception je ne trouve pas cela terrible. Il y a beaucoup de code assez tordu pour gérer tout cela. Et le besoin me semble assez élémentaire pour que sqlite propose quelque chose de similaire sans devoir gérer tout cela à la main.
Cependant j’ai parcouru la doc de sqlite sans trouver malheureusement de solutions internes qui géreraient ça de manière automatique avec juste quelques PRAGMA ou options de compilation. Mais j’ai pu louper ou mal comprendre un élément de la doc, d’où ma question si cela parle à certains.
Merci d’avance.