3 votes

Comment analyser efficacement 200 000 fichiers XML en Java ?

J'ai 200 000 fichiers XML que je veux analyser et stocker dans une base de données.

En voici un exemple : https://gist.github.com/902292

C'est à peu près aussi complexe que les fichiers XML peuvent l'être. Il sera également exécuté sur un petit VPS (Linode), la mémoire est donc limitée.

Ce que je me demande, c'est :

1) Dois-je utiliser un analyseur DOM ou SAX ? DOM semble plus facile et plus rapide puisque chaque XML est petit.

2) Où se trouve un tutoriel simple sur ce parseur ? (DOM ou SAX)

Gracias

EDIT

J'ai essayé la route DOM même si tout le monde a suggéré SAX. Principalement parce que j'ai trouvé un tutoriel "plus facile" pour DOM et j'ai pensé que la taille moyenne des fichiers étant de 3k - 4k, il serait facilement capable de contenir cela en mémoire.

Cependant, j'ai écrit une routine récursive pour traiter l'ensemble des 200 000 fichiers et elle arrive à environ 40 % de leur parcours, puis Java manque de mémoire.

Voici une partie du projet. https://gist.github.com/905550#file_xm_lparser.java

Dois-je abandonner DOM maintenant et utiliser SAX ? Il me semble juste qu'avec de si petits fichiers, DOM devrait être capable de le gérer.

De plus, la vitesse est " assez vite ". Il faut environ 19 secondes pour analyser 2000 fichiers XML (avant l'insertion dans Mongo).

Gracias

4voto

Porges Points 17745

Pourquoi ne pas utiliser une véritable base de données XML (comme Berkeley DB XML ) ? Ensuite, vous pouvez simplement verser les documents directement, et créer des index selon les besoins (par exemple, sur l'onglet HotelID ).

3voto

Pangea Points 36713

diviser pour mieux régner Répartir 200 000 fichiers dans plusieurs compartiments et paralléliser l'analyse/insertion. Regardez Exécuteurs Java 5 si vous voulez rester simple ou utiliser lot de printemps s'il s'agit d'une tâche récurrente, auquel cas vous pouvez bénéficier d'un cadre de haut niveau.

API

L'utilisation de SAX peut aider mais n'est pas nécessaire car vous n'allez pas conserver le modèle analysé (c'est-à-dire que tout ce que vous faites est d'analyser, d'insérer et ensuite de laisser partir les données analysées, à ce moment-là les objets sont éligibles pour la GC). Recherchez une API simple comme JDOM .

Autres idées

Vous pouvez implémenter un modèle de type producteur/consommateur où le producteur produit les pojo's créés après l'analyse syntaxique et le consommateur prend les pojo's et les insère dans la base de données. L'avantage ici est que vous pouvez lot l'insert s pour gagner en performance.

2voto

ThomasRS Points 5705

Choisissez SAX, ou si vous voulez, StAX. Oubliez le DOM. Utilisez une bibliothèque efficace comme aalto .

Je suis sûr que l'analyse syntaxique sera assez bon marché par rapport aux requêtes de la base de données.

Mais 200 000 n'est pas un chiffre si important si vous ne devez le faire qu'une fois.

2voto

Lalith Points 3372

SAX est toujours plus rapide que DOM. Mais puisque vous dites que les fichiers XML sont petits, vous pouvez continuer avec le parseur DOM. Une chose que vous pouvez faire pour accélérer le processus est de créer un pool de threads et d'y effectuer les opérations de la base de données. Les mises à jour multithreads amélioreront considérablement les performances.

  • Lalith

0voto

Jim Blackler Points 14306

SAX sera plus rapide que DOM, ce qui pourrait bien être un problème si vous avez 200 000 fichiers à analyser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X