Pregunta

Tengo un conjunto de herramientas que indexan el archivo XML grande (archivos de volcado MediaWiki) y uso esas indecas para el acceso aleatorio a los registros individuales almacenados en el archivo. Funciona muy bien, pero estoy "analizando" el XML con funciones de cadena y/o expresiones regulares en lugar de un analizador XML real, que es una solución frágil si la forma en que se crean los archivos se cambian en el futuro.

¿Algunos o la mayoría de los analizadores XML tienen formas de hacer esas cosas?

(Tengo versiones de mis herramientas escritas en C, Perl y Python. Al analizar los archivos completos en algún tipo de base de datos o asignarlas en memoria no son opciones).

ACTUALIZAR

Aquí hay estadísticas aproximadas para la comparación: los archivos que estoy usando se publican principalmente cada semana más o menos, el tamaño del actual es de 1,918,212,991 bytes. La versión C de mi herramienta de indexación lleva unos minutos en mi netbook y solo tiene que ejecutarse una vez para cada nuevo archivo XML publicado. Con menos a menudo, uso las mismas herramientas en otro archivo XML cuyo tamaño actual es de 30,565,654,976 bytes y se actualizó solo 8 veces en 2010.

¿Fue útil?

Solución 3

Vtd-xml Parece ser el primer intento serio de abordar este problema:

los El más eficiente de la memoria del mundo (1.3x ~ 1.5x el tamaño de un documento XML) analgésico.

(VTD-XML incluso tiene su propia etiqueta aquí en StackOverflow para que puedas seguir misiones al respecto, etc. )

Otros consejos

Creo que debe almacenar estos datos en una base de datos XML como Exist-DB, en lugar de crear sus propias herramientas para hacer un subconjunto muy pequeño de lo que le brinda una base de datos XML.

Si estás usando Python, prueba LXML - es muy Rápido y flexible, y se comparará bastante bien con las reglas para la velocidad. Mucho más rápido que las alternativas, en cualquier idioma, sin compromiso.

Use IterParse para atravesar los artículos de Wikipedia.

Tenga en cuenta que esto no le da a su acceso aleatorio a los artículos en su vertedero (¡lo cual es una solicitud perfectamente razonable!), Pero IterParse le dará un cursor 'solo solo para el futuro' ... y LXML podría ser el Herramienta correcta para usar para analizar los fragmentos a través de otros medios.

Aquí está la mejor documentación que he encontrado para ello:

http://infohost.nmt.edu/tcc/help/pubs/pylxml/web/index.html

(prueba la versión pdf)

Ahora es parte de la distribución estándar de Python.

XML es un formato estructurado. Como tal aleatorio El acceso realmente no tiene mucho sentido: debes saber a dónde vas.

La expresión regular también necesita que toda la cadena se cargue en la memoria. Esto sigue siendo mejor que DOM ya que DOM generalmente toma 3-4 veces más memoria que el tamaño del archivo XML.

La solución típica para estos casos es SAXÓFONO donde estos tienen realmente un Pequeña huella de la memoria Pero son como un cursor solo hacia adelante: por lo tanto, no está accediendo al azar, debe atravesar el árbol para llegar a donde necesita. Si está utilizando .NET, puede usar XmlTextReader.

Los índices también son útiles si el XML no se actualiza a menudo ya que crear dichos índices puede ser costoso.

XPath es mucho mejor que el "análisis" de cadena/regex, pero XPath funciona con documentos XML que se analizan en la memoria DOM primero, si sus documentos son realmente grandes, puede tener problemas de memoria.

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