Laden...

ReadXMLData und Arbeitsspeicher

Erstellt von Andy.C vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.632 Views
Andy.C Themenstarter:in
248 Beiträge seit 2004
vor 14 Jahren
ReadXMLData und Arbeitsspeicher

Tach zusammen,

Ich hab da mal eine Frage bzgl. ReadXMLData.
es wird eine Sehr komplexe und vor allem große XML Datei eingelesen.

Initialisiert wird das ganze dadurch.

ReadXMLData rXml = new ReadXMLData();
rXml.readXML("xml/" + file);

Die Datei ist ca. 170 MB Groß, im Arbeitspeicher werden dadurch kanpp 700 MB belegt.
Es treten, vorallem bei dieser größeren Datei, nach einer gewissen Laufzeit, Exceptions auf die darauf hinweise, dass nicht genügend Arbeitsspeicher zur Verfügung steht.
Bei mir, auf dem MacPro, bekomme ich diese Fehler nicht, denn der MacPro besitzt schlichtweg zuviel Arbeitsspeicher um ein derartiges Problem zu verursachen.

Abgearbeitet werden die einzelnen Elemente wie folgt.


XmlNode BRANDS = rXml.SerachForNode(rXml.root, "BuyingGroupDefinitions");
foreach (XmlNode @daten in BRANDS.ChildNodes){ ... }

Meine Frage ist jetzt diese, wie kann ich das dahingehend optimieren, dass das ganze nicht mehr so Speicherlastig ist?

Vielen Dank

LG
Andy

Kostenlose Backlinks und Linktausch auf linkSpring

6.862 Beiträge seit 2003
vor 14 Jahren

Hallo,

was soll ReadXMLData überhaupt für ne Klasse sein?

Da in deinem Quelltext die XmlNode Klasse vorkommt, nehm ich an du lädst das XML File in ein XmlDocument oder? 170 MB Xml im Speicher zu halten ist halt recht auslastend da für jede Node im Xml ja eigene Objekte erzeugt werden usw. XDocument statt XmlDocument dürfte bissle was bringen, aber net signifikant was.

Die Frage ist was du mit den Xml Daten dann vorhast. Musst du nur das File durchgehen und bestimmte Sachen parsen und auswerten? Dann bietet sich eher sowas wie der XmlTextReader an wo nicht das gesamte File in den Speicher geladen werden muss.

Baka wa shinanakya naoranai.

Mein XING Profil.

Andy.C Themenstarter:in
248 Beiträge seit 2004
vor 14 Jahren

Hallo talla,

die Daten der XML werden in eine SQL Datenbank gespeichert.

Als erstes wird die XML eingelesen, dann werden die Gruppen wie Hersteller, Preise und Artikel gesucht. Diese 3 Gruppen, wovon die Hersteller noch zu der kleinsten Gruppe gehören, werden durchgegangen.
Die einzelnen Nodes enthalten Definitionen wie UPDATE, DELETE und INSERT (um es mal ganz plump zu fomulieren).
Paralel dazu sind weitere definitionen enthalten, Gruppenspezifische werte usw. Dann jeweilige verknüpfungen unter den ganzen Nodes.

Bspw. ein Artikel ist mit einer Node unter Hersteller und mit 5 weiteren unter Preise verbunden. Diese Verbindungen sind weniger das Problem sowie auch die Werte.
Sofern die XML nu ein paar kb bis MB groß ist, klappt alles. Nur kommt es schonmal vor, dass die Daten alle verworfen werden, und eine erneute Intialisierende XML geliefert wird, weil sich auch die Preise und Konditionen ändern usw. Diese sind dann zumeist einige Hundert Megabyte groß.

Für mich ist jetzt wichtig, den Arbeitsauflauf Resourcen schohnender zu gestallten. Ich dachte da eher an die Methode, Objekte bzw. Nodes aus dem XML Objekt zu entlassen (löschen) die bereits eingelesen wurden. Aber da kommen stets blöde Fehler, die immer anders aussehen. Entweder läuft die Schleife nicht, oder es kommen Fehlermeldungen alá diese Node ist kein untergeordneter Knoten usw.

LG
Andy

Kostenlose Backlinks und Linktausch auf linkSpring

13 Beiträge seit 2010
vor 14 Jahren

Andy.C

XmlDocument und XmlPathNaviagor halten alle Daten im Speicher.

Schau dir mal den XmlReader an. Bei dieser Klasse kannst Du bestimmen wieviel Speicher der Reader benutzt.

Allerdings hat der reader einige Beschränkungen
"reader that provides fast, non-cached, forward-only access to XML data"