Frage

Im mit Python in XML-Parser baute eine 1,5 gig XML-Datei zu laden und es dauert den ganzen Tag.

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

Ich muss wissen, wie man im Inneren, und messen ihre Fortschritte zu bekommen, damit ich einen Fortschrittsbalken zeigen.  irgendwelche Ideen?

minidom hat eine andere Methode namens parseString (), die einen DOM-Baum gibt die Zeichenfolge vorausgesetzt, Sie es passieren gilt XML, Wenn ich die Datei selbst in Stücke aufgeteilt waren und geben sie einer nach dem anderen parseString, könnte ich verschmelzen alle DOM Bäume wieder zusammen am Ende?

War es hilfreich?

Lösung

Sie usecase erfordert, dass Sie SAX-Parser verwenden, anstatt dom, dom alles in den Speicher geladen wird, Saxophon stattdessen Linie tun, indem Linie Parsing und Sie schreiben Handler für Ereignisse, wie Sie benötigen so könnte wirksam sein, und Sie wären in der Lage, auch Statusanzeige schreiben

Ich empfehle auch irgendwann Expat-Parser versuchen, es ist sehr nützlich http://docs.python.org/library/pyexpat.html

für den Fortschritt mit Saxophon:

als sax liest Datei inkrementell können Sie die Datei Objekt wickeln Sie mit Ihrem eigenen Pass und Kurs halten, wie viel gelesen wurden.

edit: Ich habe auch nicht wie Idee Splitting-Datei selbst und Verbinden DOM am Ende, da man so besser Schreiben Parser Ihrer eigenen xml ist, empfehle ich SAX-Parser statt mit Ich frage mich auch, was Ihr Ziel in DOM-Baum 1.5 Gig-Datei zu lesen? aussehen wie Saxophon würde hier besser sein

Andere Tipps

Haben Sie betrachten andere Mittel zu verwenden XML-Parsen? einen Baum solcher großen XML-Dateien Gebäude wird immer langsam und speicherintensiv sein. Wenn Sie im Speicher, nicht den ganzen Baum benötigen Strom basierte Analyse wird viel schneller. Es kann ein wenig entmutigend sein, wenn Sie zu Baum basierte XML-Manipulation gewohnt sind, aber es wird in Form einer großen Geschwindigkeit zu erhöhen (Minuten statt Stunden) zahlen von.

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

Ich habe etwas sehr ähnlich für PyGTK, nicht PyQt, mit dem pulldom api. Es wird ein wenig in einer Zeit mit Gtk Ruhe Ereignissen genannt (so die GUI sperrt nicht) und Python-Generatoren (die Parsen Zustand speichern).

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)

den Baum Merging am Ende wäre ziemlich einfach. Sie könnten nur einen neuen DOM erstellen und im Grunde die einzelnen Bäume, um es eins nach dem anderen anhängen. Dies würde Ihnen recht fein abgestimmte Kontrolle über den Fortschritt der Analyse zu. Sie könnten parallelisieren es, auch wenn Sie von Laich verschiedene Prozesse wollte um jeden Abschnitt zu analysieren. Sie müssen nur sicherstellen, dass Sie es intelligent aufgeteilt (nicht in der Mitte eines Tags Aufspalten usw.).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top