Quel est le processeur XSLT de streaming basé sur Java le plus efficace? [fermé]
Question
J'ai un très gros fichier XML que je dois transformer en un autre fichier XML et j'aimerais le faire avec XSLT. Je suis plus intéressé par l'optimisation de la mémoire que par l'optimisation de la vitesse (cependant, la vitesse serait bonne aussi!).
Quel processeur XSLT basé sur Java recommanderiez-vous pour cette tâche?
Recommanderiez-vous une autre méthode (non-XSLT?, non-Java?), et si oui, pourquoi?
Les fichiers XML dans les questions sont très volumineux, mais pas très profonds - avec des millions de lignes (éléments), mais seulement environ 3 niveaux.
La solution
À l'heure actuelle, seuls trois processeurs XSLT 2.0 sont connus Saxon 9.x est probablement le plus efficace (du moins selon mes expérience) à la fois en vitesse et en utilisation de la mémoire. Saxon-SA (la version de Saxon prenant en compte le schéma, non gratuite, le B ( de base) possède des extensions spéciales pour le traitement en continu.
Parmi les différents XSLT 1.0 processeurs, .NET XslCompiledTransform (basé sur C #, pas Java!) semble être le champion.
Dans le monde des processeurs XSLT 1.0 basé sur Java Saxon 6.x encore une fois est très bon.
MISE À JOUR :
Maintenant, plus de trois ans après la date à laquelle cette question a été répondue, rien ne prouve que la différence d'efficacité entre les processeurs XSLT mentionnés ait changé.
En ce qui concerne la diffusion :
- Un document XML contenant "des millions de noeuds" peut bien être traité même sans diffusion en continu . J'ai mené une expérience au cours de laquelle Saxom 9.1.07 a traité un document XML contenant environ un million d'éléments de niveau 3 avec des valeurs entières. La transformation calcule simplement leur somme. La durée totale de la transformation sur mon ordinateur est inférieure à 1,5 seconde. La mémoire utilisée était de 500 Mo - quelque chose que les PC pourraient avoir même il y a 10 ans,
Voici les messages d'information de Saxon qui fournissent des détails sur la transformation:
Saxon 9.1.0.7J from Saxonica Java version 1.6.0_17 Stylesheet compilation time: 190 milliseconds Processing file:/C:\temp\delete\MRowst.xml Building tree for file:/C:\temp\delete\MRowst.xml using class net.sf.saxon.tinytree.TinyBuilder Tree built in 1053 milliseconds Tree size: 3075004 nodes, 1800000 characters, 0 attributes Loading net.sf.saxon.event.MessageEmitter Execution time: 1448 milliseconds Memory used: 506661648 NamePool contents: 14 entries in 14 chains. 6 prefixes, 6 URIs
- Saxon 9.4 comporte un saxon: fonction d’extension stream () pouvant être utilisée pour le traitement de gros documents XML.
Voici un extrait de la documentation :
Il y a fondamentalement deux façons de faire du streaming en Saxon:
Streaming en mode rafale: avec cette approche, la transformation d’un grand fichier est divisé en une séquence de transformations de petite morceaux du fichier. Chaque pièce est lue à partir de l’entrée, tournée dans un petit arbre en mémoire, transformé et écrit dans la sortie fichier.
Cette approche fonctionne bien pour les fichiers dont la structure est relativement plate. par exemple, un fichier journal contenant des millions d’enregistrements de journal, où le traitement de chaque enregistrement de journal est indépendant de ceux qui ont eu lieu avant.
Une variante de cette technique utilise le nouveau XSLT 3.0 xsl: iterate instruction de parcourir les enregistrements, à la place de xsl: for-each. Cela permet de conserver les données de travail au fur et à mesure que les enregistrements sont enregistrés. traitées: cela permet, par exemple, de sortir des totaux ou des moyennes à la fin de la série, ou pour effectuer le traitement d’une enregistrement dépendant de ce qui précède dans le fichier. Le xsl: itérer L’instruction permet également de sortir plus tôt de la boucle, ce qui la rend possible pour une transformation de traiter les données depuis le début d'une fichier volumineux sans lire le fichier en entier.
La diffusion en mode rafale est disponible à la fois dans XSLT et XQuery, mais n’est pas équivalent dans XQuery à la construction xsl: iterate.
Modèles de streaming: cette approche suit le XSLT traditionnel modèle de traitement pour effectuer une descente récursive du XML d'entrée hiérarchie en faisant correspondre les règles de modèle aux nœuds à chaque niveau, mais le fait un élément à la fois, avec
Autres conseils
Voir Prise en charge de Saxon pour le mode de diffusion en continu. http://www.saxonica.com/html/documentation/sourcedocs/streaming/ / a>
Si ce mode de diffusion ne vous convient pas, vous pouvez essayer d'utiliser Mode arborescence miniature de Saxon, optimisé pour une utilisation réduite de la mémoire. (C'est par défaut quand même)