Pregunta

Estoy usando el analizador XML incorporado de Python para cargar un archivo XML de 1.5 gig y me lleva todo el día.

from xml.dom import minidom
xmldoc = minidom.parse('events.xml')

Necesito saber cómo ingresar y medir su progreso para poder mostrar una barra de progreso.  alguna idea?

minidom tiene otro método llamado parseString () que devuelve un árbol DOM asumiendo que la cadena que pasa es un XML válido. Si tuviera que dividir el archivo yo mismo en trozos y pasarlos a una cadena a la vez, ¿podría fusionar todos los árboles DOM al final?

¿Fue útil?

Solución

su caso requiere que use un analizador de saxos en lugar de dom, dom carga todo en la memoria, en su lugar, saxs hará un análisis línea por línea y escribirá los controladores para los eventos que necesite. por lo que podría ser efectivo y también podría escribir el indicador de progreso

También recomiendo probar el analizador de expatriados en algún momento es muy útil http://docs.python.org/library/pyexpat.html

para el progreso utilizando sax:

a medida que el saxo lee el archivo de forma incremental, puede envolver el objeto del archivo que pase con el suyo y realizar un seguimiento de cuánto se ha leído.

editar: Tampoco me gusta la idea de dividir el archivo y unirse a DOM al final, así es mejor que escribas tu propio analizador XML, te recomiendo que utilices el analizador sax. También me pregunto cuál es su propósito de leer el archivo de 1.5 gigas en el árbol DOM? parece que el saxo sería mejor aquí

Otros consejos

¿Consideró utilizar otros medios para analizar XML? La construcción de un árbol de archivos XML tan grandes siempre será lenta y requiere mucha memoria. Si no necesita todo el árbol en la memoria, el análisis basado en secuencias será mucho más rápido. Puede ser un poco desalentador si está acostumbrado a la manipulación XML basada en árboles, pero pagará en forma de un gran aumento de velocidad (minutos en lugar de horas).

http://docs.python.org/library/xml.sax.html

Tengo algo muy similar para PyGTK, no para PyQt, que utiliza la api pulldom. Se llama poco a poco utilizando eventos inactivos de Gtk (para que la GUI no se bloquee) y generadores de Python (para guardar el estado de análisis).

def idle_handler (fn):
  fh = open (fn)  # file handle
  doc = xml.dom.pulldom.parse (fh)
  fsize = os.stat (fn)[stat.ST_SIZE]
  position = 0

  for event, node in doc:
    if position != fh.tell ():
      position = fh.tell ()
      # update status: position * 100 / fsize

    if event == ....

    yield True   # idle handler stays until False is returned

 yield False

def main:
  add_idle_handler (idle_handler, filename)

La fusión del árbol al final sería bastante fácil. Simplemente puede crear un nuevo DOM y, básicamente, agregarle los árboles individuales uno por uno. Esto también le daría un control bastante preciso sobre el progreso del análisis. Incluso podría paralelizarlo si quisiera generar diferentes procesos para analizar cada sección. Solo tienes que asegurarte de dividirlo inteligentemente (no dividirlo en medio de una etiqueta, etc.).

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