Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: MemoryMapped File Zugriff auf großes XML File...

  Alt 7. Okt 2009, 21:19
Du kannst im so einen GANZEN Puffer geben, aber wenn du vor hast via MMF die Daten "stückchenweise" Nachzuladen, dann geht das dann nicht mehr.

Es sei denn du mappst die komplette MMF in den Arbeitsspeicher und übergibst davon den Pointer, aber dann hast du nichts gekommt, da du dann wieder allles an einem Stück haben mußt, womit du ja auch so schon Probleme hast.

Du müßtest also erstmal nur einen Teil der Datei mappen, dieses vom Parser parsen lassen und sobald der Parser an das Ende dieses Stücks kommt, müßtest du den nächten Teil der Datei in den Speicher mappen und den letzen vorher Teil entladen (damit du wieder genügend Speicher hast)

Dafür müßtest du aber erstmal wissen, wann der Parser das Ende dieses Stücks erreicht, den Parser dort anhalten lassen,
den Speicher ändern und die neuen Teile nachladen,
dann die ganze Zeiger auf die Positionen im neuen Speicher verschieben
und ab da den Parser weiterlaufen lassen, bis er wieder das Ende dieses Speicherblocks erreicht hat oder das komplette Ende der Datei.

Dieser Parser ist aber so ausgelegt, daß er zwischendurch nicht in einem definierten Zustand anhält, sondern nonstop bis zum Dateiende ließt.

Du hast es also nicht leicht den Parser definiert anhalten zu lassen, wenn er das Blockende erreicht. (das dürfte sich aber noch relativ leicht ändern lassen, da er ja schön sequentiell/linear arbeitet)
Den Speicher austauschen dürfte noch leicht fallen, wenn man es sich einfach macht un die Blockgrößen begrenzt (also die maximale Länge der Nodes, Attribute und vom NodeText).
Aber nun kommt das Schwierige ... jetzt mußt du "alle" Zeiger auf den neuen Speicher verschieben
und davon gibt es hier genügend.

Das ist schließlich der Grund, warum fast alle XML-Parser nur an einem Stück lesen, weil dieses einfach einfach ist.


Wie gesagt, ich hab bei meinem Parser schon viel Zeit reinstecken müssen, um da ein funktionales System zu entwickeln. Und ich hab auch extra den Parser dafür ausgelegt, daß er eben an bestimmten Stellen einen ganz fest definierten Zustand einnimmt, wo ich dann leicht an der Speicherverwaltung rumspielen kann.

Du kannst ja gern mal in meine Units reinsehn.
In der neuen Version (beta) hab ich das alles jetzt mal abgekapselt und in die eigenständige Klasse TXReader (unit himXML.pas) verfrachtet und diese Klasse ist praktisch nur mit der Speicherverwaltung beschäftigt (bis auf die Funktion .Parse und die Hilfsprozedur .CloseSingleNode) ... also das Nachladen, Freigeben und Zerlegen der Daten.
$2B or not $2B
  Mit Zitat antworten Zitat