Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   IXMLDOMDocument Speicher (https://www.delphipraxis.net/176641-ixmldomdocument-speicher.html)

win568 18. Sep 2013 14:24


IXMLDOMDocument Speicher
 
Hallo Leute

Ich habe folgendes Problem: Wenn ich per IXMLDOMDocument neue Knoten anfüge und diese dann in einer Datei speichere, wird der belegte Speicher nach Nil setzen des Dokumentes nicht wieder freigegeben. Das ganze passiert zwar mit einer eigenen Klasse, aber selbst mit folgender Implementation funkt es nicht:

Code:
procedure TestXML;
var
  lDoc: IXMLDOMDocument;
  lRootNode, lNode: IXMLDOMNode;
  i: Integer;
begin
  lDoc := CoDOMDocument60.Create;
  try
    lRootNode := lDoc.createElement('Root');
    lDoc.appendChild(lRootNode);
    for i := 0 to 1000000 do begin
      lNode := lDoc.createElement('Child' + IntToStr(i));
      lNode.text := 'Childknoten ' + IntToStr(i);
      lRootNode.appendChild(lNode);
    end;
    lDoc.save('D:\Test.xml');
  finally
    lDoc := nil;
  end;
end;
Nach dem Nil setzen, sollte der belegte Speicher ja wieder freigegeben werden. Aber nix tut sich.

baumina 18. Sep 2013 14:35

AW: IXMLDOMDocument Speicher
 
Normalerweise werden Klassen in Delphi, die mit Klasse.Create aufgerufen wurden mit Klasse.Free oder FreeAndNil(Klasse) wieder freigegeben.

win568 18. Sep 2013 14:37

AW: IXMLDOMDocument Speicher
 
Hi

Dies ist normalerweise richtig. Nur handelt es sich hier nicht um eine Delphi Klasse sondern um ein IXMLDOMDocument Interface, das mit CoDOMDocument60 erzeugt wird. Wenn dieses auf Nil gesetzt wird, wird per _Release automatisch der Speicher freigegeben.

baumina 18. Sep 2013 14:46

AW: IXMLDOMDocument Speicher
 
Hilft das weiter?

temporäre Interfaces sofort freigeben?

win568 18. Sep 2013 14:53

AW: IXMLDOMDocument Speicher
 
Hi Baumina

Danke für den Beitrag. Leider erklärt er nicht das Verhalten. IXMLDOMDocument verhält sich anders als IXMLDocument. Der beim Laden oder Befüllen des Dokumentes assoziierte Speicher wird leider nicht freigegebenen. Unverständlicherweise kann man die oben beschriebene Routine mehrfach hintereinander ausführen, ohne das mehr Speicher benötigt wird. Anscheinend checkt das das IXMLDOMDocument und verwendet den bereits reservierten Speicher. Dieses Verhalten ist aber bei uns problematisch, da dies nur für das IXMLDOMDocument gilt. Delphi kann auf den Speicher nicht mehr zugreifen -> Problem für die weitere Verarbeitung.

baumina 18. Sep 2013 15:12

AW: IXMLDOMDocument Speicher
 
Mal interessehalber : Womit überwachst du den Speicher?

win568 18. Sep 2013 15:13

AW: IXMLDOMDocument Speicher
 
ProcessExplorer

Bernhard Geyer 18. Sep 2013 15:17

AW: IXMLDOMDocument Speicher
 
IXMLDOMDocument ist doch das Interface des MS-Parsers. Da wirst du nich viel machen können als auf einen nativen Delphi XML-Parser zu wechseln. Das was der MS-Parser im Speicher hält ist außerhalb des Delphi-Speichermanagers.

win568 18. Sep 2013 15:19

AW: IXMLDOMDocument Speicher
 
Gibt es keine Möglichkeit nach dem Beenden das Auszuleeren. Mein Problem ist ja, das der Speicher, da es sich um einen INPROC Prozess handelt meinem Programm abgeht.
Das Ausweichen auf eine andere Komponente funkt leider nicht, da wir auch Transformationen vornehmen.

Insider2004 18. Sep 2013 22:34

AW: IXMLDOMDocument Speicher
 
Nimm doch den ADOM.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz