2010-07-07 28 views
12

Tengo un archivo xml grande (1 Gb). Necesito hacer muchas consultas en este archivo xml (usando xpath por ejemplo). Los resultados son pequeñas partes del xml. Quiero que las consultas sean lo más rápidas posible, pero el archivo de 1 Gb es probablemente demasiado grande para la memoria de trabajo.Consultas aleatorias en un archivo xml grande

El XML es como la siguiente:

<all> 
    <record> 
     <id>1</id> 
     ... lots of fields. (Very different fields per record including (sometimes) subrecords 
     so mapping on a relational database would be hard). 
    </record> 
    <record> 
     <id>2</id> 
     ... lots of fields. 
    </record> 
    .. lots and lots and lots of records 
</all> 

Necesito acceso aleatorio, la selección de registros usando, por ejemplo, como una tecla. (Id es más importante, pero también se pueden usar otros campos como clave). No sé las consultas por adelantado, llegan y deben ejecutarse lo antes posible, sin ejecución de lotes, pero en tiempo real. SAX no parece muy prometedor porque no quiero volver a leer el archivo completo para cada consulta. Pero DOM no parece muy prometedor tampoco, porque el archivo es muy grande y la adición de una sobrecarga de estructura adicional seguramente significará que no va a caber en la memoria de trabajo.

¿Qué biblioteca/enfoque de Java podría usar mejor para manejar este problema?

+0

_¿Qué tipo de consultas necesitas hacer? ¿Las consultas se procesarán por lotes o por solicitud? ¿Qué otras características de su escenario puede proporcionar? –

+0

+1 para editar para explicar el problema claramente –

Respuesta

1

vtd-xml es la mejor opción para su uso. http://vtd-xml.sourceforge.net/

+1

Esto parece prometedor. Miro esto, y si satisface mis necesidades, puedo marcar la pregunta como respondida. – Jan

0

Piccolo es un pequeño y extremadamente rápido analizador de XML para Java. Implementa las interfaces SAX 1, SAX 2.0.1, and JAXP 1.1 (SAX parsing only) como un analizador no validador. Es available en Apache's License

+0

El último lanzamiento de piccolo es de 2004 y hay informes de errores abiertos que tienen varios años de antigüedad, por lo que no recomendaría su uso. –

4

Al manejar XML, generalmente tiene dos enfoques: transmisión (SAX) o cargar el documento completo en la memoria (varias implementaciones DOM).

Si puede preestablecer un conjunto de consultas para su procesamiento a granel, puede escribir un programa para usar SAX para transmitir el archivo, buscando coincidencias. Si las consultas llegan a intervalos aleatorios (es decir, una aplicación de base de datos típica), deberá cargar todo el documento en la memoria o preprocesar el documento XML en una base de datos de algún tipo.

Una mejor descripción de lo que está tratando de lograr podría ayudar a obtener mejores respuestas.

+0

+1 para la mejor descripción para mejores respuestas ... –

Cuestiones relacionadas