Quel est le processeur XSLT de streaming basé sur Java le plus efficace? [fermé]

StackOverflow https://stackoverflow.com/questions/460895

  •  19-08-2019
  •  | 
  •  

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.

Était-ce utile?

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 :

  1. 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
  1. 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

Vous pouvez envisager de STX , dont l'implémentation Java est Joost . Comme il est similaire à XSLT, mais étant un processeur de flux, il est capable de traiter des fichiers énormes en utilisant très peu de RAM.

Joost peut être utilisé en tant que javax.xml.transform.TransformerFactory standard

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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top