Analyse de documents XML volumineux dans JAVA
J'ai le problème suivant:
J'ai un fichier XML (environ 1 GO), et à la parcourir de haut en bas (c'est à dire non séquentielle; l'un après l'autre) afin d'obtenir les données nécessaires et les utiliser pour effectuer des opérations. D'abord, j'ai utilisé le DOM package Java, mais de toute évidence, bien que l'analyse dans le fichier XML, la JVM atteint sa taille maximale de la mémoire et de l'interruption.
Afin de surmonter ce problème, une des solutions, je suis venu avec, a été de trouver un autre analyseur qui parcourt chaque élément dans le fichier XML, puis-je stocker son contenu dans une temporaire Base de données SQLite sur mon disque Dur. Ainsi, de cette manière, la JVM du tas n'est pas dépassé, et une fois que toutes les données sont remplis, j'ignore le fichier XML et de continuer mes activités sur la Base de données SQLite.
Est-il une autre façon de comment je peut résoudre mon problème?
source d'informationauteur cgval
Vous devez vous connecter pour publier un commentaire.
SAX (Simple API for XML) va vous aider ici.
Voici un exemple de mise en œuvre:
Où dans
MyHandler
vous de définir les mesures à prendre lorsque des événements comme celui de début/de fin de document/élément sont générés.Si vous ne voulez pas être lié par les les limites de la mémoireje n'ai certainement recommandons de vous servir de votre approche, et de stocker le tout dans la base de données.
L'analyse du fichier XML doit être fait par un
SAX parser
comme tout le monde l'a recommandé (y compris moi). De cette façon, vous pouvez créer un objet à la fois, et vous pouvez immédiatement persistent dans la base de données.Pour le post-traitement (résolution des références croisées), vous pouvez utiliser
SELECT
s à partir de la base de données, rendre les clés primaires, index, etc. Vous pouvez utiliser l'ORM (Eclipselink, Hibernate) et si vous vous sentez à l'aise avec cela.En fait je n'ai pas vraiment recommander SQLite, il est plus facile de configurer un serveur MySQL, et de stocker les données. Plus tard, vous pouvez même réutiliser les données XML (si vous ne les supprimez pas).
Si vous souhaitez utiliser un plus haut niveau de l'approche que de SAX, qui peut être très difficile de programme, vous pourriez regarder en streaming des transformations XSLT à l'aide d'une récente Saxon-EE libération. Cependant, vous avez été trop vague précises sur le traitement que vous faites pour savoir si cela fonctionne pour votre cas particulier.
si vous avez besoin d'une ressource conviviale approche pour traiter de très grands xml, essayez ceci:
http://www.xml2java.net/xml-to-java-data-binding-for-big-data/
il vous permet de traiter les données dans un SAX, mais avec l'avantage d'avoir des événements de haut niveau (xml de données mappées sur java) et être capable de travailler avec ces objets dans votre code directement. il combine la jaxb commodité et SAX ressources friendlyness.