Hi ihr,
Ich stehe gerade vor einer elementaren Frage: (*trommelwirbel* *tätäää*)
In einer Anwendung lese ich aus einer Datei eine unbekannte, aber große Zahl an Daten aus (irgendwo im 5 bis 6-stelligen Bereich). Nun werden die Daten zuerst in den
RAM geladen, anschließend wird noch eine zweite Zahl Daten geladen, die dann wieder auf die ersten Daten zugreifen müssen. Dabei werden die ersten Daten dann entweder genutzt (=kopiert), separat gespeichert oder verworfen(=gelöscht).
Wem die Erklärung genügt, der kann den nächsten Teil getrost überspringen.
Konkreter Anwendungsfall
Es geht natürlich um meinen Routenplaner. Die
XML-Datei ist so organisiert:
Die Wege bestehen aus einer Liste von Knoten. Allerdings beinhalten diese Knoten nur Referenzen auf die jeweiligen Knoten vorher. Realbeispiel:
XML-Code:
<node id="123".../>
<node id="678".../>
<way id="453"...>
<nd ref="123"/>
<nd ref="678"/>
</way>
Jetzt möchte ich natürlich nicht die Referenzen der Knoten im Weg speichern, sondern die Knoten selbst. Ich muss also alle Knoten im Speicher vorhalten.
Die Frage ist jetzt, was eignet sich für mein Vorhaben am Besten? Im Moment habe ich das noch mit einem dynamischen Array gelöst. Allerdings habe ich das Gefühl, dass das zu einem Leck führt, und zwar aus dem von
shmia angeführten Gründen, denn mit SetLength arbeite ich auch.
Jetzt kommt der Punkt, wo ich Elemente auch löschen müsste. Dazu sehe ich zwei effiziente Möglichkeiten:
- Boolscher Wert im Record
- Komplett auf Liste umsteigen
Momentan arbeite ich mit Records:
Delphi-Quellcode:
type
TORPTag = packed record
Key: String[255];
Value: String[255];
end;
TORPTags = Array of TORPTag;
TORPNode = packed record
ID: String;
Lat: String;
Lon: String;
Tags: TORPTags;
end;
TORPNodes = Array of TORPNode;
TORPSubNode = packed record
Ref: String;
end;
TORPSubNodes = Array of TORPSubNode;
TORPWay = packed record
ID: String;
SubNodes: TORPNodes;
Tags: TORPTags;
end;
TORPWays = Array of TORPWay;
TORPMember = packed record
MemberType: String[255];
Ref: String[255];
Role: String[255];
end;
TORPMembers = Array of TORPMember;
TORPRelation = packed record
ID: String;
Tags: TORPTags;
Members: TORPMembers;
end;
TORPPOI = packed record
POIType: String[255];
Custom: Integer;
POIName: String[255];
NodeID: String[255];
end;
TORPPOIS = Array of TORPPOI;
Wie man sieht, verstecken sich dort doch recht viele Dynamische Arrays. Ich bin im Moment noch in der glücklichen Situation, ganz am Anfang des Projekts zu stehen. Ich habe also noch Spielraum und kann noch umdisponieren.
Was meint ihr dazu?