Frage

Ich bin mit Expat-Parser eine XML-Datei von rund 15 GB zu analysieren. Das Problem ist, es löst einen „Out of Memory“ Fehler und das Programm abgebrochen wird.

Ich möchte wissen, hat jeder Körper ein ähnliches Problem mit dem Expat-Parser konfrontiert, oder ist es ein bekannter Fehler und wurde in späteren Versionen behoben?

War es hilfreich?

Lösung

Ich habe Expat verwendet, um große Dateien zu analysieren, bevor und hatte nie Probleme. Ich nehme an, Sie verwenden SAX und nicht einer der Expat-DOM-Wrapper. Wenn Sie DOM verwenden, dann genau dort, das ist Ihr Problem -. Es würde im Wesentlichen die gesamte Datei in den Speicher zu laden versuchen,

Zuweisen von Objekten, wie Sie die XML analysieren und sie vielleicht nicht das Aufheben von Zuweisungen? Das wäre das erste, was ich würde überprüfen. Eine Möglichkeit, zu überprüfen, ob das Problem wirklich mit Expat oder nicht - wenn Sie das Programm auf eine einfache Version zu reduzieren, die leeren Tag-Handler hat (dh es parst die Datei nur und tut nichts mit den Ergebnissen) hat es noch nicht genügend Arbeitsspeicher laufen?

Andere Tipps

Ich weiß Expat gar nicht, aber ich würde vermuten, dass es aus irgendeinem Grund zu viel Staat im Speicher zu halten, hat das. Ist der XML-mal in irgendeiner Weise gebildet? Haben Sie Handler für End-Tags von großen Blöcken registriert haben?

Ich denke, dass, wenn Sie einen Handler für das Ende eines großen Blöcke registriert haben, und Expat erwartet wird, um den Block an die Prozedur zu übergeben, dann könnte Expat aus dem Speicher ausgeführt werden, bevor es in der Lage ist, vollständig um diesen Block zu sammeln . Wie gesagt, ich weiß nicht auswandern, so dass dies nicht möglich sein könnte, bin ich nur fragen.

Alternativ sind Sie sicher, dass Expat ist, wo der Gedächtnisverlust? Ich könnte eine Situation vorstellen, wo Sie einige Informationen über den Inhalt der XML-Datei wurden zu halten, und Ihre eigenen Datenstrukturen, entweder weil die Daten so groß war, oder wegen der Speicherlecks in Ihrem Code, verursachte den Ausgang der Speicherbedingung.

Expat ist ein ereignisgesteuerte Parser, der nicht groß in-Speicherstrukturen nicht konstruieren. So ist es wahrscheinlich nicht Expat (was sehr häufig für das Parsen von großen Dateien verwendet wird), dass das Problem ist -. Viel wahrscheinlicher ist es Ihr eigener Code

Expat hat Lecks - Ich habe angefangen, es in einem mit langen Laufzeit-Server verwenden, und bin zu finden, dass es Speicher konsequent Lecks, ob die Parser befreit ist oder nicht. Neuere Versionen von xmlparse.c dieses Problem nicht lösen, nur bestehende Lecks verbergen.

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