Extrem langsame Schreibzugriffe auf XmlDocument


vanilla

Mitglied
Hi

Ich nutze die XmlDocument-Klasse und habe eine Projekt-Datei mit einer Größe von derzeit 14kb.

Angezeigt werden die Daten in einem TreeView.

Das Lesen ist kein Problem und geht auch in einer akzeptablen Geschwindigkeit.

Beim Schreiben der Knoten (Attribute, InnerText) oder beim Anlegen neuer Knoten und deren Attributen steigt die CPU-Last auf 100% und der Rechner benötigt einige Minuten für den Vorgang.

Das Kuriose ist, wenn ich das Projekt speichere und das Programm neu starte, geht das Erstellen wieder schnell, verlangsamt sich dann aber zusehends mit jedem weiteren neuen Knoten.

Woran kann das liegen?
Ist die Datei schon jetzt zu gross um sie im Speicher zu lassen und zu bearbeiten?


mfg
 

Christian Kusmanow

Erfahrenes Mitglied
Hallo vanilla!

Also dein Problem ist das beim schreiben des XML's alles langsamer wird?
Wenn ja, mit was und wie erstellst Du denn das XML?
Der XmlTextWriter zB schreibt ungecached in das XML. Sollte also nicht daran liegen.
Mehr Details würden echt mehr aussagen.

Btw. wenn Du den TreeView füllst, solltest Du dir mal den Hinweis
in diesem [thread=184190]Repaint unterdrücken - Thread[/thread] anschaun. ;)

MfG, cosmo
 

vanilla

Mitglied
Hi

Danke für Deine schnelle Antwort.

Ich bin nicht gerade der Type der gut erklären kann, also fragt bitte falls Unklarheiten bestehen...

Problem
Also mein Problem sind wirklich nur die Schreibzugriffe auf die XML-Struktur.
Lesen ist kein Problem ( der TreeView war hier nur als leichte "Projekterklärung" angeführt).

Einen neuen Knoten erstelle ich z.B. mit folgender Funktion:

Code:
void myDATA_ST_Project::m_ActiveDisplay_linkedAction_Condition_New(XmlNode* __xnCondition)
	XmlElement* __xeTemp;
	XmlAttribute* __xaTemp;

	XmlElement* __xeCondition = this->v_xmlProject->CreateElement("ad_act_linked_action_condition");
	__xaTemp = this->v_xmlProject->CreateAttribute("conditionID");
	__xaTemp->Value = "none";
	__xeCondition->Attributes->Append(__xaTemp);
	__xaTemp = this->v_xmlProject->CreateAttribute("destinationID");
	__xaTemp->Value = "none";
	__xeCondition->Attributes->Append(__xaTemp);
					
	__xnCondition->AppendChild(__xeCondition);
}

Anm.: xmlProject ist ein Object einer abgeleiteten XmlDocument-Klasse


Bei jedem der Bibliotheksaufrufe (->CreateElement, ->CreateAttribute, ->Append) geht die CPU-Last auf 100% und es dauert minutenlang.

Als Methode des XML-Zugriffs habe ich DOM gewählt.
Der Vorteil ist, das XML-File im Speicher liegt.
Ich kann also die Knoten anspringen so wie ich sie brauche, ohne jedesmal meine Datei neu lesen zu müssen.

mfg
Vanilla
 

Christian Kusmanow

Erfahrenes Mitglied
Ok, aber ich bin leider kein cpp Crack. Versuche aber zu helfen.
vanilla hat gesagt.:
Bei jedem der Bibliotheksaufrufe (->CreateElement, ->CreateAttribute, ->Append) geht die CPU-Last auf 100% und es dauert minutenlang.
Kann es sein das dies ein Thread - übergeifender Zugriff ist?
Also das Du ein ein Objekt ansprichst, was von einem anderen Thread erstellt wurde?
Ich weiss jetzt aber nicht ob sich genau so wie im .NET 1.1 (C#) verhält,
da man dort dabei evtl. genau solche wartezeiten hat oder Du gleich eine Exception,
wie jetzt auch im .NET 2.0 bekommst.
Oder hast Du evtl. die Methoden CreateElement, CreateAttribute, Append überschrieben?
Wenn ja, was passiert da?

Ansonsten fällt mir nichts ein.
 

vanilla

Mitglied
Also die Methoden sind nicht überschrieben auch nutze ich kein Multi-Threading, also...

Ich dachte das so ein Problem evtl. bekannt ist und schonmal jemand darüber gestolpert ist.


Aber Danke für Deine Hilfe!