J'ai donc fait quelques tests avec sqlite pour les très gros fichiers, et je suis parvenu à des conclusions (au moins pour mon application spécifique).
Les tests impliquent un seul fichier sqlite avec une seule table ou plusieurs tables. Chaque table avait environ 8 colonnes, presque tous des entiers et 4 indices.
L'idée était d'insérer suffisamment de données jusqu'à ce que les fichiers sqlite mesurent environ 50 Go.
Table simple
J'ai essayé d'insérer plusieurs lignes dans un fichier sqlite avec une seule table. Lorsque le fichier était d'environ 7 Go (désolé, je ne peux pas être précis sur le nombre de lignes), les insertions prenaient beaucoup trop de temps. J'avais estimé que mon test pour insérer toutes mes données prendrait environ 24 heures, mais il ne s'est pas terminé même après 48 heures.
Cela m'amène à conclure qu'une seule table sqlite très grande aura des problèmes avec les insertions, et probablement d'autres opérations également.
Je suppose que ce n'est pas une surprise, car le tableau s'agrandit, l'insertion et la mise à jour de tous les indices prennent plus de temps.
Tables multiples
J'ai ensuite essayé de diviser les données par le temps sur plusieurs tables, une table par jour. Les données du tableau 1 d'origine ont été divisées en ~ 700 tableaux.
Cette configuration n'a eu aucun problème avec l'insertion, elle n'a pas pris plus de temps avec le temps, car une nouvelle table a été créée pour chaque jour.
Problèmes de vide
Comme l'a souligné i_like_caffeine, la commande VACUUM est un problème plus le fichier sqlite est volumineux. Au fur et à mesure que plus d'insertions / suppressions sont effectuées, la fragmentation du fichier sur le disque va s'aggraver, donc l'objectif est de périodiquement VACUUM pour optimiser le fichier et récupérer l'espace du fichier.
Cependant, comme le souligne la documentation , une copie complète de la base de données est réalisée pour faire le vide, ce qui prend beaucoup de temps. Ainsi, plus la base de données est petite, plus cette opération se terminera rapidement.
Conclusions
Pour mon application spécifique, je répartirai probablement les données sur plusieurs fichiers db, un par jour, pour obtenir le meilleur des performances de vide et de la vitesse d'insertion / suppression.
Cela complique les requêtes, mais pour moi, c'est un compromis intéressant de pouvoir indexer autant de données. Un avantage supplémentaire est que je peux simplement supprimer un fichier db entier pour supprimer une journée de données (une opération courante pour mon application).
Je devrais probablement également surveiller la taille de la table par fichier pour voir quand la vitesse deviendra un problème.
Il est dommage qu'il ne semble pas y avoir de méthode de vide incrémentielle autre que le vide automatique . Je ne peux pas l'utiliser car mon objectif pour le vide est de défragmenter le fichier (l'espace fichier n'est pas un gros problème), ce que le vide automatique ne fait pas. En fait, la documentation indique que cela peut aggraver la fragmentation, je dois donc recourir périodiquement à un vide complet sur le fichier.