Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi 2GB Ram wegen Dynamischen Array (https://www.delphipraxis.net/119567-2gb-ram-wegen-dynamischen-array.html)

BeBored 28. Aug 2008 12:20


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:
GleisArray: array of array of array of array of string;
Dann lese ich aus der Datenbank die einzelnen Felder von einer SQL Abfrage für ein DrawGrid ein:
Delphi-Quellcode:
SetLength(GleisArray, 0,0,0,0);
Count := queryTexte.RecordCount +1;
SetLength(GleisArray, Count, Count, Count, Count);
Und dann wird es mit den Daten gefüllt:
Delphi-Quellcode:
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;
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:

Die Muhkuh 28. Aug 2008 12:31

Re: 2GB Ram wegen Dynamischen Array
 
Ich würde das mit Objekten und nicht mit einem Array lösen.

Delphi-Quellcode:
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;
Nur mal so als Rumpf.

BeBored 28. Aug 2008 12:35

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?

RWarnecke 28. Aug 2008 12:42

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 : http://www.michael-puff.de/Developer..._in_Delphi.pdf

Edit:
Hier noch der Link zum Tutorial in der DP : http://www.delphipraxis.net/internal...hlight=klassen

Corpsman 28. Aug 2008 13:04

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:

Tgleis = Record
  x,
  y,
  Feldtext,
  Art:String;
end;

GleisArray = Array of TGleis;
das wäre dann auch deutlich geringer im Speicherbedarf als dein n^4 array

BeBored 28. Aug 2008 13:16

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 Tutorial durch.
Danke für die Hilfe. Verbraucht ein Array dieser größe (Count ist ungefähr 150) so viel Speicher?

BUG 28. Aug 2008 13:26

Re: 2GB Ram wegen Dynamischen Array
 
Zitat:

Zitat von BeBored
Verbraucht ein Array dieser größe (Count ist ungefähr 150) so viel Speicher?

Ja.

Code:
150^4 = 506250000

String, wenn nichts drin steht, glaub ich, 4 Bytes.

506250000*4 Bytes = 2025000000 Bytes, ungefähr 1,885928213596343994140625 Gigabytes
MfG,
Bug

Corpsman 28. Aug 2008 13:33

Re: 2GB Ram wegen Dynamischen Array
 
und wenn du das 1-D machst sind das eben nur


150 * 4 = 600 B

BeBored 28. Aug 2008 14:35

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:

Medium 28. Aug 2008 23:58

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:19 Uhr.
Seite 1 von 2  1 2      

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