2011-01-22 25 views
5

Tengo un archivo xml grande que contiene muchos elementos secundarios. Quiero poder ejecutar algunas consultas xpath. Intenté usar vtd-xml en java, pero a veces salgo del error de memoria porque el xml es tan grande que cabe en la memoria. ¿Hay alguna forma alternativa de procesar tales xml's grandes?Procesando archivos xml grandes

+0

¿Por qué la etiqueta Python tiene esta pregunta? ¿Esperas que las personas ofrezcan soluciones de Python? – Spaceghost

+0

¿Tiene errores de memoria insuficiente al analizar el documento o cuando intenta consultas xpath? Si es el segundo, tal vez el problema sea con las consultas xpath. De cualquier manera, ¿intentó aumentar el valor de -Xmx para Heap para la JVM? – Spaceghost

+0

intente extendido vtd-xml y utilice la opción de mapeo de memoria –

Respuesta

2

es muy eficiente cuando se trabaja con archivos de gran tamaño

+1

No puede usar XPath con una transmisión SAX directa (excepto volver a analizar todo el archivo para cada consulta). –

+0

@Glenn Maynard - pero seguramente el OP * tiene que * volver a analizar el archivo para cada consulta (o lote de consultas). El DOM es demasiado grande para caber en la memoria. –

2

¿Qué está tratando de hacer ahora mismo? Por lo que suena, estás tratando de usar un analizador basado en DOM, que esencialmente carga todo el archivo XML en la memoria como una representación DOM. Si está tratando con un archivo grande, será mejor que utilice un analizador SAX, que procesa el documento XML de forma continua.

Yo personalmente recomiendo StAX para esto.

0

¿Utilizaste vtd estándar o VTD-xml extendido? Si usa XML extendido, entonces tiene la opción de usar la asignación de memoria ... ¿lo intentó?

0

Usar XPath podría no ser una muy buena idea si planea compilar muchas expresiones dinámicamente en una aplicación de larga duración.

No estoy del todo seguro de cómo funciona la versión Java de XPath, pero en .NET XPath compila un ensamblaje dinámico y luego lo agrega al dominio de la aplicación. Los usos posteriores de la expresión miran el conjunto ahora cargado en la memoria.
En un caso, donde estaba usando XPath me llevó a una situación en la que, creo, este mismo tipo de mecanismo se ralentizaba llenando la memoria de forma similar a una pérdida de memoria.

Mi teoría es que a medida que cada expresión se compilaba utilizando los valores del usuario, cada expresión compilada era probablemente única, por lo que se compilaba y agregaba una nueva expresión al dominio de la aplicación.
Dado que puede eliminar el ensamblaje del dominio de la aplicación sin reiniciar todo el dominio de la aplicación, la memoria se consumía cada vez que se evaluaba una expresión y no se podía recuperar. Como resultado, el código goteaba memoria en forma de ensamblajes en la memoria, y después de un tiempo, usted conoce los resultados.

Cuestiones relacionadas