¿Cuál es el procesador XSLT de transmisión basado en Java más eficiente? [cerrado]

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

  •  19-08-2019
  •  | 
  •  

Pregunta

Tengo un archivo XML muy grande que necesito transformar en otro archivo XML, y me gustaría hacerlo con XSLT. Estoy más interesado en la optimización de la memoria, en lugar de la optimización de la velocidad (¡aunque la velocidad también sería buena!).

¿Qué procesador XSLT basado en Java recomendaría para esta tarea?

¿Recomendaría alguna otra forma de hacerlo (¿no es XSLT ?, ¿no Java?) y, de ser así, ¿por qué?

Los archivos XML en las preguntas son muy grandes, pero no muy profundos, con millones de filas (elementos), pero solo unos 3 niveles de profundidad.

¿Fue útil?

Solución

En la actualidad solo hay tres XSLT 2.0 procesadores conocidos y de ellos Saxon 9.x es probablemente el más eficiente (al menos según mi experiencia) tanto en velocidad como en utilización de memoria. Saxon-SA (la versión de Saxon compatible con el esquema, no libre como B ( versión básica) tiene extensiones especiales para el procesamiento por streaming.

De los varios XSLT 1.0 fuertes, .NET XslCompiledTransform (basado en C #, ¡no Java!) parece ser el campeón.

En el mundo basado en Java de los procesadores XSLT 1.0 Saxon 6.x nuevamente es bastante bueno.

ACTUALIZACIÓN :

Ahora, más de 3 años después de la fecha en que se respondió originalmente esta pregunta, no hay evidencia de que la diferencia de eficiencia entre los procesadores XSLT mencionados haya cambiado.

En cuanto a la transmisión :

  1. Un documento XML con "millones de nodos" bien puede procesarse incluso sin transmisión . Realicé un experimento en el que Saxom 9.1.07 procesó un documento XML que contiene alrededor de un millón de elementos de tercer nivel con valores enteros. La transformación simplemente calcula su suma. El tiempo total para la transformación en mi computadora es menos de 1.5 segundos. La memoria utilizada era de 500 MB, algo que las PC podían tener incluso hace 10 años,

Aquí están los mensajes informativos de Saxon que muestran detalles sobre la transformación:

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 tiene un saxon: función de extensión stream () que se puede utilizar para procesar documentos XML enormes.

Aquí hay un extracto de la documentación :

  

Básicamente, hay dos formas de hacer streaming en Saxon:

     

Transmisión en modo ráfaga: con este enfoque, la transformación de un   archivo grande se divide en una secuencia de transformaciones de pequeño   piezas del archivo Cada pieza a su vez se lee desde la entrada, se gira   en un pequeño árbol en la memoria, transformado y escrito en la salida   archivo.

     

Este enfoque funciona bien para archivos que tienen una estructura bastante plana,   por ejemplo, un archivo de registro con millones de registros, donde el   El procesamiento de cada registro es independiente de los que fueron   antes.

     

Una variante de esta técnica utiliza el nuevo XSLT 3.0 xsl: iterate   instrucción para iterar sobre los registros, en lugar de xsl: for-each.   Esto permite que los datos de trabajo se mantengan como están los registros.   procesado: esto hace posible, por ejemplo, generar totales o   promedios al final de la ejecución, o para realizar el procesamiento de uno   registro dependiente de lo que vino antes en el archivo. El xsl: iterar   La instrucción también permite la salida anticipada del bucle, lo que hace que   posible que una transformación procese datos desde el comienzo de un   archivo grande sin leer realmente todo el archivo.

     

La transmisión en modo ráfaga está disponible tanto en XSLT como en XQuery, pero hay   no es equivalente en XQuery a la construcción xsl: iterate.

     

Plantillas de transmisión: este enfoque sigue el XSLT tradicional   patrón de procesamiento de realizar un descenso recursivo del XML de entrada   jerarquía haciendo coincidir las reglas de plantilla con los nodos en cada nivel, pero   lo hace un elemento a la vez, con

Otros consejos

Podría considerar STX , cuya implementación de Java es Joost . Como es similar a XSLT, pero al ser un procesador de flujo, puede procesar archivos enormes con muy poca RAM.

Joost se puede utilizar como javax.xml.transform.TransformerFactory estándar

Consulte el soporte de Saxon para el modo de transmisión. http://www.saxonica.com/html/documentation/sourcedocs/streaming/

Si este modo de transmisión no es para usted, puede intentar usar modo de árbol pequeño de Saxon, que está optimizado para un menor uso de memoria. (De todos modos es predeterminado)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top