Hallo,
Umg.: Delphi 6 Ent. UP2
Ich lese mittels TMemIniFile Daten aus sehr großen INI-Dateien aus und erzeuge daraus durch TXMLDocument XML-Dateien. Das Auslesen verläuft rasend schnell, aber das Erzeugen der XML-Datei dauert unverhältnismäßig langsam.
Nachdem die Daten ausgelesen sind, verwalte ich sie in eigenen Klassenstrukturen. Jede dieser Klassen verfügt über eine SaveToXML() Methode. Im Kern tut sie folgendes:<PRE><CODE>
procedure SaveToXML(var XML: String);
var
nodeGroup, nodeItems, nodeData: IXMLNode;
begin
with MyXMLDocument do begin
if not Active the Active := True;
if Assigned(XMLFindNode(...)) then Exit;
nodeGroup := ChildNodes[...];
nodeGroup.AddChild(...).Text := ...;
nodeItems := nodeGroup(AddChild);
for I := 0 to FList.Count - 1 do begin
nodeData := nodeItems.AddChild(...);
FList[I].AnotherObject.SaveToXML(AXML);
end;
SaveToXML(AXML);
end;
end;</PRE></CODE>
Wie man sieht, sind die Klassen auch ineinander eingebettet (z.B. die Einträge in FList stellen wiederum Klassen dar).
Die Funktion XMLFindNode arbeitet nach XPath-Spezifikation und lokalisiert innerhalb einer XML-Datei einen bestimmten Eintrag. Sie sieht wie folgt aus:<PRE><CODE>
function XMLFindNode(const GroupName, ObjectName, IDName: String; ID: Integer): IXMLDOMNode;
begin
// siehe XPath Spezifikation für das Lokalisieren
Result := ((MyXMLDocument.DOMDocument as IXMLDOMNodeRef).GetXMLDOMNode).selectSingleNode(Fo rmat('/%s/%s/%s[@%s="%d"]',
['MyCompanyName', GroupName, ObjectName, IDName, ID]));
end;</PRE></CODE>
Das Problem: Hat z.B. obige Klasse 20000 Einträge in ihrer Liste (FList.Count = 20000), so dauert das Speichern ca. 30 Minuten (!). Das komplette Einlesen und Aufbauen dieser Strukturen selbst geschieht in ein paar Sekunden.
Danke<br>
Stephan
Umg.: Delphi 6 Ent. UP2
Ich lese mittels TMemIniFile Daten aus sehr großen INI-Dateien aus und erzeuge daraus durch TXMLDocument XML-Dateien. Das Auslesen verläuft rasend schnell, aber das Erzeugen der XML-Datei dauert unverhältnismäßig langsam.
Nachdem die Daten ausgelesen sind, verwalte ich sie in eigenen Klassenstrukturen. Jede dieser Klassen verfügt über eine SaveToXML() Methode. Im Kern tut sie folgendes:<PRE><CODE>
procedure SaveToXML(var XML: String);
var
nodeGroup, nodeItems, nodeData: IXMLNode;
begin
with MyXMLDocument do begin
if not Active the Active := True;
if Assigned(XMLFindNode(...)) then Exit;
nodeGroup := ChildNodes[...];
nodeGroup.AddChild(...).Text := ...;
nodeItems := nodeGroup(AddChild);
for I := 0 to FList.Count - 1 do begin
nodeData := nodeItems.AddChild(...);
FList[I].AnotherObject.SaveToXML(AXML);
end;
SaveToXML(AXML);
end;
end;</PRE></CODE>
Wie man sieht, sind die Klassen auch ineinander eingebettet (z.B. die Einträge in FList stellen wiederum Klassen dar).
Die Funktion XMLFindNode arbeitet nach XPath-Spezifikation und lokalisiert innerhalb einer XML-Datei einen bestimmten Eintrag. Sie sieht wie folgt aus:<PRE><CODE>
function XMLFindNode(const GroupName, ObjectName, IDName: String; ID: Integer): IXMLDOMNode;
begin
// siehe XPath Spezifikation für das Lokalisieren
Result := ((MyXMLDocument.DOMDocument as IXMLDOMNodeRef).GetXMLDOMNode).selectSingleNode(Fo rmat('/%s/%s/%s[@%s="%d"]',
['MyCompanyName', GroupName, ObjectName, IDName, ID]));
end;</PRE></CODE>
Das Problem: Hat z.B. obige Klasse 20000 Einträge in ihrer Liste (FList.Count = 20000), so dauert das Speichern ca. 30 Minuten (!). Das komplette Einlesen und Aufbauen dieser Strukturen selbst geschieht in ein paar Sekunden.
Danke<br>
Stephan
Comment