Xml ou Sqlite, Quand abandonner le XML pour une firebase database?

J’aime vraiment Xml pour enregistrer des données, mais quand sqlite / database est-il la meilleure option? Par exemple, lorsque le xml a plus de x éléments ou est supérieur à y MB?

Je code un lecteur rss et je crois que j’ai fait le mauvais choix en utilisant xml sur une firebase database sqlite pour stocker un cache de tous les éléments de stream. Il existe des stream contenant un fichier XML d’environ 1 Mo après un mois, un autre contenant plus de 700 éléments, tandis que la plupart ne contiennent que 30 éléments et une taille d’environ 50 Ko après plusieurs mois.

Je n’ai actuellement pas l’intention de mettre en place un plafond car j’aime pouvoir faire des recherches dans tout.

Donc, mes questions sont:

  1. Quand la surcharge de sqlite / databases est-elle justifiée par l’utilisation de XML?
  2. Les quelques fichiers XML de grande taille sont-ils suffisants pour la firebase database lorsqu’il y en a beaucoup , même si les plus petits se développent avec le temps? (longtemps long )

mis à jour (plus d’infos)

Chaque fois qu’un stream est sélectionné dans l’interface graphique, je recharge tous les éléments à partir de ce fichier XML.

Je dois aussi modifier le statut read / unread qui semble vraiment piraté lorsque je passe en revue tous les nœuds du XML pour trouver l’élément, puis le configurer pour qu’il soit lu / non lu.

Je suis fondamentalement d’accord avec Mitchel , cela peut être très spécifique en fonction de ce que vous allez faire avec XML / sqlite. Pour votre cas (cache), il me semble que l’utilisation de sqlite (ou d’autres dbs incorporés) est plus judicieuse.

Tout d’abord, je ne pense pas vraiment que sqlite nécessitera plus de ressources que XML. Et je parle à la fois de temps de développement et de temps d’exécution. Le seul problème est que vous avez une dépendance à la bibliothèque sqlite. Mais comme vous avez besoin d’une bibliothèque pour XML, peu importe (je suppose que le projet est en C / C ++).

Avantages de sqlite sur xml:

  • tout dans un fichier,
  • la perte de performance est inférieure à XML car le cache grossit,
  • vous pouvez garder les métadonnées de stream séparées du cache lui-même (autre table), mais accessibles de la même manière,
  • SQL est probablement plus facile à utiliser que XPath pour la plupart des gens.

Inconvénients de sqlite:

  • peut être problématique avec plusieurs processus accédant à la même firebase database (probablement pas votre cas),
  • vous devriez savoir au moins SQL de base. À moins qu’il y ait des centaines de milliers d’éléments dans le cache, je ne pense pas que vous aurez besoin de l’optimiser beaucoup,
  • Peut-être que d’une certaine manière, cela peut être plus dangereux du sharepoint vue de la sécurité (injection SQL). D’un autre côté, vous ne codez pas l’application Web, cela ne devrait donc pas se produire.

D’autres choses sont probablement à égalité pour les deux solutions.

Pour résumer, répondez respectivement à vos questions:

  1. Vous ne le saurez pas, sauf si vous testez votre application spécifique avec les deux backends. Sinon c’est toujours juste une supposition. Le support de base pour les deux caches ne devrait pas poser de problème pour le code. Ensuite, comparez et comparez.

  2. En raison de la façon dont les fichiers XML sont organisés, les recherches sqlite devraient toujours être plus rapides (sauf cas en coin où cela n’a pas d’importance, car elles sont extrêmement rapides). Accélérer les recherches en XML nécessiterait de toute façon une firebase database d’index, dans votre cas, cela signifierait avoir un cache pour le cache, ce qui n’est pas une très bonne idée. Mais avec sqlite, vous pouvez avoir une indexation dans la firebase database.

J’ai l’expérience avec ça. Je travaille sur un projet où nous avons initialement stocké toutes nos données à l’aide de XML, puis déplacé vers sqlite. Il existe de nombreux avantages et inconvénients pour chaque technologie, mais ce sont les performances qui ont provoqué le basculement. Voici ce que nous avons observé.

Pour les petites bases de données (quelques Mo ou moins), XML était beaucoup plus rapide et plus facile à gérer. Nos données étaient naturellement dans un format d’arborescence, ce qui rendait XML beaucoup plus attrayant, et XPATH nous permettait de faire de nombreuses requêtes en une seule ligne plutôt que de devoir parcourir un arbre d’ascendance.

Nous programmions dans un environnement Win32 et utilisions la bibliothèque standard Microsoft DOM. Nous chargerions toutes les données en mémoire, les parsingrions dans un arbre principal et chercherions, appendions, modifierions sur la copie en mémoire. Nous sauvegardions périodiquement les données et nous devions faire pivoter les copies au cas où la machine tomberait en panne en cours d’écriture.

Nous devions aussi construire des “index” à la main en utilisant des cartes d’arborescence C ++. Ceci, bien sûr, serait sortingvial à faire avec SQL.

Notez que la taille des données sur le système de fichiers était un facteur de 2 à 4 fois inférieur à celui de l’arbre dom en mémoire.

Au moment où les données ont atteint la taille 10M-100M, nous avons commencé à avoir de vrais problèmes. Chose intéressante, à toutes les tailles de données, le traitement XML était beaucoup plus rapide que celui de sqlite (car il était en mémoire, pas sur le disque dur)! Le problème était en fait double: premièrement, le temps de chargement commençait vraiment à être long. Nous aurions besoin d’attendre une minute environ 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 attachée tout le temps. Les systèmes avec seulement quelques centaines de mégapixels ne répondraient pas dans d’autres applications, même si nous courions très vite.

Nous étudions actuellement l’utilisation d’une firebase database XML basée sur un système de fichiers. Il existe deux versions de bases de données XML à source ouverte, nous les avons essayées. Je n’ai jamais essayé d’utiliser une firebase database xml commerciale, donc je ne peux pas les commenter. Malheureusement, nous ne pourrions jamais faire fonctionner les bases de données XML. Même le fait de remplir la firebase database avec des centaines de méga-octets de XML a pris des heures… Peut-être que nous l’utilisions de manière incorrecte. Un autre problème était que ces bases de données étaient assez lourdes. Ils avaient besoin de Java et avaient une architecture de serveur client complète. Nous avons abandonné cette idée.

Nous avons trouvé sqlite alors. Cela a résolu nos problèmes, mais à un prix. Lorsque nous avons initialement installé sqlite, les problèmes de mémoire et de temps de chargement ont disparu. Malheureusement, comme tout le traitement était maintenant effectué sur le disque dur, la charge de traitement en arrière-plan a augmenté. Alors que plus tôt nous n’avions jamais remarqué la charge du processeur, l’utilisation du processeur était maintenant en hausse. Nous devions optimiser le code et continuer à conserver certaines données en mémoire. Nous devions également réécrire de nombreuses requêtes XPATH simples en tant qu’algorithmes de multiquerie compliqués.

Donc, voici un résumé de ce que nous avons appris.

  1. Pour les données d’arborescence, XML est beaucoup plus facile à interroger et à modifier à l’aide de XPATH.

  2. Pour les petits ensembles de données (moins de 10 M), le XML a rapidement éliminé le sqlite.

  3. Pour les jeux de données volumineux (supérieurs à 10 Mo à 100 Mo), 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.

  4. Nous n’avons pas pu obtenir de firebase database XML opensource pour résoudre les problèmes associés aux jeux de données volumineux.

  5. 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 (il se trouve sur le disque dur, pas dans la mémoire). (Les tables note-sqlite peuvent être stockées en mémoire, peut-être que cela le rendrait aussi rapide … Nous n’avons pas essayé car nous voulions extraire les données de la mémoire.)

  6. Stocker et interroger des données d’arborescence dans un tableau n’est pas agréable. Cependant, la gestion des transactions et l’indexation compensent partiellement.

N’oubliez pas que vous avez une excellente firebase database à scope de main: le système de fichiers!

Beaucoup de programmeurs oublient qu’une structure de fichier d’annuaire décente est / a:

  1. C’est rapide comme l’enfer
  2. C’est portable
  3. Il a une faible empreinte à l’exécution

Les gens parlent de diviser les fichiers XML en plusieurs fichiers XML … Je voudrais envisager de diviser votre XML en plusieurs répertoires et en plusieurs fichiers en texte brut.

Essayez. C’est vite rapide.

Je n’utiliserais pas XML pour stocker des éléments RSS. Un lecteur de stream effectue des mises à jour constantes à mesure qu’il reçoit des données.

Avec XML, vous devez d’abord charger les données du fichier, les parsingr, puis les stocker pour faciliter la recherche, la récupération et la mise à jour. Cela ressemble à une firebase database …

En outre, que se passe-t-il si votre application se bloque? Si vous utilisez XML, quel est l’état des données dans le fichier XML par rapport aux données en mémoire. Au moins avec SQLite, vous obtenez de l’atomicité, donc vous êtes assuré que votre application démarrera avec le même état que lors de la dernière écriture de la firebase database.

Il est préférable d’utiliser XML comme format d’échange lorsque vous devez déplacer des données de votre application vers un autre emplacement ou partager des informations entre applications. Une firebase database devrait être la méthode de stockage préférée pour presque toutes les applications de taille.

  1. Utilisez XML pour les données que l’application doit connaître: configuration, journalisation, etc.
  2. Utiliser des bases de données (Oracle, SQL Server, etc.) pour les données avec lesquelles l’utilisateur interagit directement ou indirectement – des données réelles
  3. Utilisez SQLite si les données utilisateur correspondent plus à une collection sérialisée – comme une énorme liste de fichiers et leur contenu ou collection d’éléments de messagerie, etc.

Dépend du type et de la taille des données.

Quand XML doit-il être utilisé pour la persistance des données au lieu d’une firebase database? Presque jamais. XML est un langage de transport de données. Il est lent à parsingr et difficile à interroger. Analyser le XML (ne le déchiquetez pas!) Et convertir les données résultantes en objects de domaine. Ensuite, persistez les objects du domaine. Le principal avantage d’une firebase database pour la persistance est le SQL, qui signifie des requêtes non structurées et un access à des outils communs et à des techniques d’optimisation.

Pour moi, cela dépend vraiment de ce que vous faites avec eux, combien d’utilisateurs / de processus ont besoin d’y accéder en même temps, etc.

Je travaille constamment avec des fichiers XML volumineux, mais ce sont des éléments de style d’importation, de processus unique, multi-utilisateurs ou dont les performances ne sont pas vraiment nécessaires.

Donc vraiment c’est un équilibre.

Si vous avez besoin d’une mise à l’échelle, utilisez des bases de données.

XML est utile pour stocker des données qui ne sont pas complètement structurées et que vous souhaitez généralement échanger avec une autre application. Je préfère utiliser une firebase database SQL pour les données. XML est sujet aux erreurs car vous pouvez provoquer des erreurs subtiles dues aux fautes de frappe ou aux commissions dans les données elles-mêmes. Certains frameworks d’applications open source utilisent trop de fichiers XML pour la configuration, les données, etc. Je préfère les avoir en SQL.

Puisque vous demandez une règle générale, je dirais que l’utilisation de données d’application, de configuration, etc., basées sur XML, si vous voulez la configurer une seule fois et ne pas y accéder / la rechercher beaucoup. Pour les recherches et les mises à jour actives, il est préférable d’utiliser SQL.

Par exemple, un serveur Web stocke des données d’application dans un fichier XML et vous n’avez pas vraiment besoin d’effectuer des recherches complexes. Mettez à jour le fichier. Le serveur Web démarre, lit le fichier xml et cela. Donc, XML est parfait ici. Supposons que vous utilisez un framework comme Struts. Vous devez utiliser XML et les configurations d’action ne changent pas beaucoup une fois l’application développée et déployée. Donc, encore une fois, le fichier XML est un bon moyen. Maintenant, si votre application développée par Struts permet des recherches et des mises à jour, des suppressions, le SQL est le moyen optimal.

Bien entendu, vous rencontrerez sûrement un ou deux développeurs de votre entreprise qui ne chanteront que XML ou SQL et proclameront XML ou SQL comme la seule solution. Méfiez-vous de ces gens et faites ce qui vous semble approprié pour votre application. Ne vous contentez pas de suivre une «religion de la technologie».

Pensez à la fréquence à laquelle vous devez mettre à jour les données, à quelle fréquence vous devez rechercher les données. Ensuite, vous aurez votre réponse sur ce qu’il faut utiliser – XML ​​ou SQL.

Je suis passé à SQLite et je me sens beaucoup mieux en sachant que c’est dans une firebase database.

Il y a beaucoup d’autres avantages à cela:

  • L’ajout de nouveaux éléments est très simple
  • Tri par plusieurs colonnes
  • Suppression des doublons avec un index unique

J’ai créé 2 vues, une pour les éléments non lus et une pour tous les éléments, mais je ne suis pas sûr que ce soit la meilleure utilisation des vues, mais je voulais vraiment les utiliser.

J’ai également évalué le xml vs sqlite en utilisant la classe StopWatch , et le sqlite est plus rapide, bien que ma méthode d’parsing des fichiers xml ne soit pas la plus rapide .

  1. Petits articles et taille (25 articles, 30ko)
    • ~ 1,5 ms sqlite
    • ~ 8,0 ms xml
  2. Grand nombre d’articles (700 articles, 350kb)
    • ~ 20 ms sqlite
    • ~ 25 ms xml
  3. Grande taille de fichier (850 éléments, 1024 Ko)
    • ~ 45 ms sqlite
    • ~ 60 ms xml

Je suis d’accord avec @Bradley.

XML est très lent et pas particulièrement utile comme format de stockage. Pourquoi s’embêter? Allez-vous éditer les données à la main en utilisant un éditeur de texte? Si c’est le cas, XML n’est toujours pas un format très pratique comparé à quelque chose comme YAML. Avec quelque chose comme SQlite, les requêtes sont plus faciles à écrire et il existe une API bien définie pour recevoir et extraire vos données.

XML est bien si vous avez besoin d’envoyer des données entre les programmes. Mais au nom de l’efficacité, vous devriez probablement produire le XML au moment de l’envoi et l’parsingr en “données réelles” au moment de la réception.

Tout ce qui précède signifie que votre question sur “quand la surcharge d’une firebase database est justifiée” est un peu discutable. XML a un temps de traitement beaucoup plus important que SQlite. (Les bases de données complètes, telles que MSSQL, sont plus lourdes, en particulier dans les tâches administratives, mais la question est totalement différente.)

XML peut être stocké sous forme de texte et sous forme de fichier binary.

Si votre objective principal est de laisser un ordinateur lire / écrire un format de fichier de manière efficace, vous devez utiliser un format de fichier binary.

Les bases de données sont un moyen facile à utiliser pour stocker et conserver des données. Ils ne constituent pas le moyen le plus rapide de stocker des données au format binary.

Ce qui peut accélérer les choses est d’utiliser un type de firebase database / firebase database en mémoire. Sqlite a cette option.

Et cela semble être la meilleure façon de le faire pour vous.

Mon opinion est que vous devez utiliser SQLite (ou une autre firebase database intégrée appropriée) à tout moment où vous n’avez pas besoin d’un format de fichier de texte pur. Notez que c’est une très grosse exception. Il existe de nombreux scénarios nécessitant ou bénéficiant de formats de fichiers en texte pur.

En ce qui concerne les frais généraux, SQLite comstack à quelque chose comme 250 k avec des drapeaux normaux. De nombreuses bibliothèques d’parsing XML sont plus grandes que SQLite. Vous n’obtenez aucun gain de simultanéité avec XML. Le format de fichier binary SQLite prendra en charge des écritures beaucoup plus efficaces (en grande partie parce que vous ne pouvez pas append à la fin d’un fichier XML bien formaté). Et même lire des données, dont je suppose qu’il s’agit d’un access assez aléatoire, sera plus rapide avec SQLite.

Et pour couronner le tout, vous avez access aux avantages de SQL, comme les transactions et les index.

Edit: oublié de mentionner. L’un des avantages de SQLite (par opposition à de nombreuses bases de données) est qu’il permet n’importe quel type de ligne dans n’importe quelle colonne. Fondamentalement, avec SQLite, vous obtenez la même liberté que vous avez avec XML en termes de types de données. Cela signifie également que vous n’avez pas à vous soucier de la limitation des colonnes de texte.

Notez que de nombreuses grandes bases de données relationnelles (Oracle et SQLServer) ont des types de données XML pour stocker des données dans une firebase database et utilisent XPath dans l’instruction SQL pour accéder à ces données.

En outre, il existe des bases de données XML natives qui fonctionnent très bien comme SQLite dans le sens où elles constituent un fichier binary contenant une collection de documents (qui pourrait être une table). Vous pouvez alors utiliser XPath / XQuery sur un seul document ou la collection entière. Ainsi, avec une firebase database XML, vous pouvez faire des choses comme stocker les données du jour en tant que document XML distinct dans la collection … il vous suffit donc d’utiliser ce document pour traiter les données d’aujourd’hui. Mais écrivez un fichier XQuery pour trouver des données historiques sur la collecte de documents pour cette personne. Nappe.

J’ai utilisé Berkeley XMLDB (désormais soutenu par Oracle). Il y en a d’autres si vous effectuez une recherche sur Google pour “Native XML Database”. Je n’ai pas vu de problème de performances avec le stockage / la récupération de données de cette manière.

XQuery est une bête différente (mais qui vaut vraiment la peine d’être apprise), mais vous pouvez simplement utiliser les XPath que vous utilisez actuellement avec de légères modifications.

Une firebase database est géniale dans le cadre de votre programme. Si l’interrogation des données fait partie de votre logique métier. XML est préférable au format de fichier, surtout si votre format de données est:

1, Hierarchal
2, susceptible de changer à l’avenir d’une manière que vous ne pouvez pas deviner
3, les données vont vivre plus longtemps que le programme

Je dis que ce n’est pas une question de taille de données, mais de type de données. Si vos données sont structurées , utilisez une firebase database relationnelle. Si vos données sont semi-structurées , utilisez XML ou, si les quantités de données deviennent trop importantes, une firebase database XML.

Si votre recherche va avec une firebase database. Vous pouvez diviser les fichiers xml en répertoires pour faciliter la recherche, mais la surcharge de gestion devient assez lourde. Vous obtenez également beaucoup plus que de simples performances avec une firebase database SQL …