Vitesse contre place en mémoire
Bonjour à tous !
Je dois réaliser en java un editeur XML, c´est à dire quelque chose qui puis lire et ecrire des informations, qui ont un format précis (et toujours le meme), dans des fichiers au format XML.
En gros c´est une espece de base de données au format XML où chaque fichier représente une table.
Le probleme est que ces fichiers devraient faire plusieurs mega, rendant pratiquement impossible l´utilisation d´un parser DOM (qui charge tout le fichier XML en memoire) . J ai donc pensé a un parser SAX (qui genere un evenement pour chque tag, je crois bien).
Seulement, la question que je me pose est celle de la vitesse : en effet l´utilisateur doit pouvoir rechercher un enregistrement parmi des milliers et a chaque recherche, on va devoir re-lire une bonne partie du fichier XML pour tomber sur le bon enregistrement.
J´ai donc pense a essayer de mettre en place un espece d´index, où je stockerai en memoire, pour chaque n° d´enregistrement, la position (en octets) dans le fichier XML, histoire d´avoir un acces direct sans avoir pour autant à garder tout le fichier XML en memoire.
Qu´en pensez vous ?
Y´a t´il une solution plus simple ?
Sinon comment implementer ca en Java ??? (en gros ! je ne vous demande pas de faire le boulot a ma place mais plutot quelles sont les grandes lignes a suivre)
Merci d´avance
Denis
Re: [Java, XML et SAX] Vitesse contre place en mémoire
Citation:
Envoyé par Dinaïz
Je dois réaliser en java un editeur XML, c´est à dire quelque chose qui puis lire et ecrire des informations, qui ont un format précis (et toujours le meme), dans des fichiers au format XML.
En gros c´est une espece de base de données au format XML où chaque fichier représente une table.
Petit préambule, je te conseille de lire mes réponses aux messages [Debutant][JBDC] dev d une application et [Débutant][JDBC]java mysql. Elles n'apportent pas vraiment de réponses à ton problème mais parle de solutions fonctionnelles : MySQL, SQLite... Hélas ce ne sont pas des SGBD capables de gérer des bases XML en natif.
Citation:
Le probleme est que ces fichiers devraient faire plusieurs mega, rendant pratiquement impossible l´utilisation d´un parser DOM (qui charge tout le fichier XML en memoire) . J ai donc pensé a un parser SAX (qui genere un evenement pour chque tag, je crois bien).
En effet dans le cas d'une base XML et non plus pas d'un simple petit ficheir XML, il vaut mieux opter pour SAX. Cependant il ne s'agit que d'un parseur, ça ne résoud en rien ton problème de devoir gérer une base XML : insertions, mises à jour, suppressions...
Citation:
Seulement, la question que je me pose est celle de la vitesse : en effet l´utilisateur doit pouvoir rechercher un enregistrement parmi des milliers et a chaque recherche, on va devoir re-lire une bonne partie du fichier XML pour tomber sur le bon enregistrement.
J´ai donc pense a essayer de mettre en place un espece d´index, où je stockerai en memoire, pour chaque n° d´enregistrement, la position (en octets) dans le fichier XML, histoire d´avoir un acces direct sans avoir pour autant à garder tout le fichier XML en memoire.
Le travail que tu décris est celui d'un SGBD. Le langage SQL permet de commander le SGBD et de faire des recherches, d'insérer des enregistrements, de les mettre à jour ou encore de les supprimer. Pour optimiser les traitements les SGBD utilisent différentes techniques, dont l'utilisation d'index.
Donc d'après moi le plus simple est d'utiliser un SGBD capable de gérer en natif une base XML. Je commence tout juste à m'intéresser au sujet mais Xindice ne semble être qu'une base native XML et non pas un SGBD. Ce qu'il faut c'est un SGBD qui exploite certaines technologies XML (XPath par exemple) pour gérer la base XML efficacement. Tu trouveras d'autres SBGD ou bases dans la catégorie XML dababases de Google. Pour l'instant je me cantonne à utiliser MySQL et SQLite. MySQL en PHP et SQLite en C/C++. Vu que je me remets à Java, je n'ai pas encore vraiment besoin d'un SGBD et pour l'instant j'ai plutôt dans l'idée d'utiliser SQLite....
Si j'étais toi, je m'orienterais vers Xindice, il doit bien exister des technologies connexes pour gérer cette base, après je ne sais pas trop si parler de base plutôt que de SGBD est un abus de langage ou une référence au jargon XML. Dans ma liste j'ai aussi la base Berkeley de Sleepycat, c'est plus qu'une base XML, c'est un SGBD qui supporte la gestion d'une base XML, utilisation d'XPath, d'index... À titre d'exemple cette base est embarqué à TortoiseSVN. Tu pourrais demander aux auteurs ce qui les a poussé à choisir ce SGBD plutôt qu'un autre.
J'espère trouver du temps pour continuer mes recherches, que ceux qui ont une certaine expérience sur ces sujets n'hésitent pas se manifester :).