¿Cuál es el procesador XSLT de transmisión basado en Java más eficiente? [cerrado]
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.
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 :
- 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
- 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
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)