J'ai de l'expérience dans ce domaine. Je travaille sur un projet où nous avons initialement stocké toutes nos données en utilisant XML, puis nous sommes passés à sqlite. Il y a beaucoup d'avantages et d'inconvénients à chaque technologie, mais c'est la performance qui a provoqué le changement. Voici ce que nous avons observé.
Pour les petites bases de données (quelques mégas ou moins), le XML était beaucoup plus rapide et plus facile à gérer. Nos données étaient naturellement dans un format arborescent, ce qui rendait XML beaucoup plus attrayant, et XPATH nous permettait d'effectuer de nombreuses requêtes en une seule ligne plutôt que de devoir parcourir un arbre généalogique.
Nous programmions dans un environnement Win32, et utilisions la bibliothèque DOM standard de Microsoft. Nous chargions toutes les données en mémoire, les analysions dans un arbre DOM et effectuions des recherches, des ajouts et des modifications sur la copie en mémoire. Nous sauvegardions périodiquement les données, et avions besoin de faire tourner les copies au cas où la machine se planterait au milieu d'une écriture.
Nous avons également dû construire quelques "index" à la main en utilisant des cartes d'arbres C++. Ceci, bien sûr, serait trivial à faire avec sql.
Notez que la taille des données sur le système de fichiers était inférieure d'un facteur 2-4 à celle de l'arbre de dom "en mémoire".
Lorsque les données ont atteint une taille de 10 à 100 millions, nous avons commencé à avoir de vrais problèmes. Il est intéressant de noter qu'à toutes les tailles de données, le traitement XML était beaucoup plus rapide que sqlite (parce qu'il était en mémoire et non sur le disque dur) ! Le problème était en fait double : d'abord, le temps de chargement commençait vraiment à devenir long. Nous devions attendre une minute ou plus avant que les données soient en mémoire et que les cartes soient construites. Bien sûr, une fois chargé, le programme était très rapide. Le deuxième problème était que toute cette mémoire était occupée en permanence. Les systèmes ne disposant que de quelques centaines de mégaoctets ne répondaient pas aux autres applications, même si le programme était très rapide.
Nous envisageons actuellement d'utiliser une base de données xml basée sur un système de fichiers. Il existe quelques bases de données xml en version libre, nous les avons essayées. Je n'ai jamais essayé d'utiliser une base de données xml commerciale, je ne peux donc pas les commenter. Malheureusement, nous n'avons jamais réussi à faire fonctionner correctement les bases de données xml. Même le fait de remplir la base de données avec des centaines de méga de xml prenait des heures..... Peut-être l'utilisions-nous de manière incorrecte. Un autre problème était que ces bases de données étaient assez lourdes. Elles nécessitaient Java et avaient une architecture client-serveur complète. Nous avons abandonné cette idée.
Nous avons trouvé sqlite alors. Il a résolu nos problèmes, mais à un prix. Lorsque nous avons branché sqlite pour la première fois, les problèmes de mémoire et de temps de chargement ont disparu. Malheureusement, comme tous les traitements étaient désormais effectués sur le disque dur, la charge de traitement en arrière-plan a augmenté. Alors qu'auparavant nous n'avions jamais remarqué la charge du processeur, maintenant son utilisation était beaucoup plus importante. Nous avons dû optimiser le code et conserver certaines données en mémoire. Nous avons également dû réécrire de nombreuses requêtes XPATH simples en algorithmes multi-requêtes complexes.
Voici donc un résumé de ce que nous avons appris.
-
Pour les données arborescentes, XML est beaucoup plus facile à interroger et à modifier à l'aide de XPATH.
-
Pour les petits ensembles de données (moins de 10M), XML a surpassé sqlite en termes de performances.
-
Pour les grands ensembles de données (plus de 10M-100M), le temps de chargement XML et l'utilisation de la mémoire sont devenus un gros problème, au point que certains ordinateurs deviennent inutilisables.
-
Nous n'avons pas trouvé de base de données xml opensource pour résoudre les problèmes liés aux grands ensembles de données.
-
SQLITE n'a pas les problèmes de mémoire de XML dom, mais il est généralement plus lent dans le traitement des données (elles sont sur le disque dur, pas en mémoire). (note- les tables sqlite peuvent être stockées en mémoire, peut-être que cela le rendrait aussi rapide..... Nous n'avons pas essayé cela car nous voulions sortir les données de la mémoire).
-
Stocker et interroger des données d'arbres dans une table n'est pas agréable. Cependant, la gestion des transactions et de l'indexation compense partiellement.