![]() |
2GB Ram wegen Dynamischen Array
Hallo,
ich versuche ja ein Gleisplanprogramm zu schreiben und dazu benutze ich ein Dynamisches Array mit 4 Dimensionen.
Delphi-Quellcode:
Dann lese ich aus der Datenbank die einzelnen Felder von einer SQL Abfrage für ein DrawGrid ein:
GleisArray: array of array of array of array of string;
Delphi-Quellcode:
Und dann wird es mit den Daten gefüllt:
SetLength(GleisArray, 0,0,0,0);
Count := queryTexte.RecordCount +1; SetLength(GleisArray, Count, Count, Count, Count);
Delphi-Quellcode:
Aber nun frißt die Anwendung 2GB Speicher und das kann eigentlich nur am Array liegen. Benutze ich SetLength falsch? MadExcept zeigt jedenfalls beim Disassembler das Array mit GetMem, ReallocMem und FinalizeArray an. :cry:
while not queryTexte.Eof do
begin GleisArray[i, 0, 0, 0] := query.FieldByName('x').AsString; GleisArray[0, i, 0, 0] := query.FieldByName('y').AsString; GleisArray[0, 0, i, 0] := query.FieldByName('Feldtext').AsString; GleisArray[0, 0, 0, i] := query.FieldByName('Art').AsString; Inc(i); query.Next; end; |
Re: 2GB Ram wegen Dynamischen Array
Ich würde das mit Objekten und nicht mit einem Array lösen.
Delphi-Quellcode:
Nur mal so als Rumpf.
TGleisAbschnitt = class(TObject)
private public property X: Integer; property Y: Integer; property FeldText: string; property Art: string; end; TGleis = class(TObjectList) private public property Items[Index: Integer]: TGleisAbschnitt; end; |
Re: 2GB Ram wegen Dynamischen Array
Bin für alles offen, aber mit einer ObjectList habe ich noch nie gearbeitet. Kannst du mir ein näheres Beispiel geben?
|
Re: 2GB Ram wegen Dynamischen Array
Das Tutorial von Luckie, sollte Dir dabei weiterhelfen. Da werden die Grundlagen vermittelt. Hat mir auch sehr geholfen und kann ich nur empfehlen :thumb:
Hier der Link zum PDF : ![]() Edit: Hier noch der Link zum Tutorial in der DP : ![]() |
Re: 2GB Ram wegen Dynamischen Array
so wie das aussieht würde dir ein 1-D array auch reichen.
Das dann als Elemente einen Record hat
Delphi-Quellcode:
das wäre dann auch deutlich geringer im Speicherbedarf als dein n^4 arrayTgleis = Record x, y, Feldtext, Art:String; end; GleisArray = Array of TGleis; |
Re: 2GB Ram wegen Dynamischen Array
Mit Klassen weiß ich ein wenig bescheid, die nutze ich oft aber mit ObjectList habe ich noch nie gearbeitet.
Aber ich gehe gerade dieses ![]() Danke für die Hilfe. Verbraucht ein Array dieser größe (Count ist ungefähr 150) so viel Speicher? |
Re: 2GB Ram wegen Dynamischen Array
Zitat:
Code:
MfG,
150^4 = 506250000
String, wenn nichts drin steht, glaub ich, 4 Bytes. 506250000*4 Bytes = 2025000000 Bytes, ungefähr 1,885928213596343994140625 Gigabytes Bug |
Re: 2GB Ram wegen Dynamischen Array
und wenn du das 1-D machst sind das eben nur
150 * 4 = 600 B |
Re: 2GB Ram wegen Dynamischen Array
Achso ok :oops:
Da ich noch heute etwas mit dem Programm testen will, habe ich das RecordArray genommen, das klappt super... blöd das ich nicht gleich darauf gekommen bin. Aber man lernt ja nie aus :-D Früher oder später werde ich mich aber intensiv mit ObjectList auseinandersetzen. Ich danke herzlich für eure wie immer großartige Hilfe :cheers: |
Re: 2GB Ram wegen Dynamischen Array
Edit: Ich hab grad erst erkannt, dass in der 4D-Array Variante einfach nur kaum etwas vom reservierten Speicher verwendet wurde. Ich hab im Text hier vor zwar vorgeschlagen die Daten "on demand" aus der DB zu holen, aber wenn jeder der Strings im Schnitt so 10 Zeichen hat sind das insgesamt ja nur ca. 32kB Gesamtverbrauch.
Ich wollte dann nur noch anmerken, dass mir die Felder "x" und "y" so vorkommen, als wäre es nicht nur speicherschonender sondern auch nachher im Programm deutlich besser zu handhaben, wenn du diese Werte nicht als klobigen String, sondern als Zahlenwert hälst. String-Konversionen sehen doof aus, und kosten vergleichsweise viel Zeit. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 Uhr. |
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