Delphi-PRAXiS

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.

Luckie 29. Aug 2008 00:13

Re: 2GB Ram wegen Dynamischen Array
 
Zitat:

Zitat von BeBored
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;

Schon alleine dieses Konstrukt, das sieht ja grausam aus, würde mich nach einer besseren Lösung suchen lassen. ;)

BeBored 29. Aug 2008 09:02

Re: 2GB Ram wegen Dynamischen Array
 
Zitat:

Zitat von Medium
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.

Ja das mache ich mit dem Record jetzt auch so, ist wesentlich bequemer :-)

@Lucky: Ich weiß, aber genau wegen solchen Sachen frage ich ja hier, ich will ja besser werden und man versucht ja immer erst das Problem mit dem vorhandenen Wissen zu lösen :oops:

grenzgaenger 29. Aug 2008 17:31

Re: 2GB Ram wegen Dynamischen Array
 
Zitat:

Zitat von BeBored
Delphi-Quellcode:
GleisArray: array of array of array of array of string;

du weisst schon, was du da machst, z.b. weisst du einen leeren string zu und deine DB hat 100 datensätze ... dann brauchst du erst mal mind. so viel speicher = 6 * 101 * 101 * 101 * 101 wenn deine db dann 1000 sätze zurückliefert brauchst du mind so viel speicher 6 * 1001 * 1001 * 1001 * 1001. das ausmultiplizieren überlass ich dir (mit der hand), damit du 'n bischen gefühl dafür bekommst ;-)

BeBored 29. Aug 2008 19:52

Re: 2GB Ram wegen Dynamischen Array
 
Zitat:

Zitat von grenzgaenger
Zitat:

Zitat von BeBored
Delphi-Quellcode:
GleisArray: array of array of array of array of string;

du weisst schon, was du da machst, z.b. weisst du einen leeren string zu und deine DB hat 100 datensätze ... dann brauchst du erst mal mind. so viel speicher = 6 * 101 * 101 * 101 * 101 wenn deine db dann 1000 sätze zurückliefert brauchst du mind so viel speicher 6 * 1001 * 1001 * 1001 * 1001. das ausmultiplizieren überlass ich dir (mit der hand), damit du 'n bischen gefühl dafür bekommst ;-)

Das Problem ist ja längst erledigt. Ich habe jetzt ein eindimensionales Array mit einem Record. Das die vorherige Methode nicht gut war, war mir schon bewußt und genau aus diesem Grund habe ich mich ja an die DP gewendet. Später werde ich das ganze mit ObjectList machen, aber da muss ich mich erst einmal reinfuchsen.

Jelly 30. Aug 2008 10:22

Re: 2GB Ram wegen Dynamischen Array
 
Zitat:

Zitat von BeBored
Ich habe jetzt ein eindimensionales Array mit einem Record. Das die vorherige Methode nicht gut war, war mir schon bewußt und genau aus diesem Grund habe ich mich ja an die DP gewendet. Später werde ich das ganze mit ObjectList machen, aber da muss ich mich erst einmal reinfuchsen.

Nimm lieber gleich Klassen statt Records. Du hast doch sicherlich auch noch irgendwelche Dinge mit deinen Daten vor. Dazu brauchst du Methoden, und einige davon gehören sicherlich direkt in dein Objekt rein.

Und Methoden, die deine ganze Sammlung an Objekten betreffen, die kannst du z.B. gleich in einer abgeleiteten ObjectList unterbringen, oder mit Collections arbeiten.

BeBored 30. Aug 2008 15:29

Re: 2GB Ram wegen Dynamischen Array
 
Ja genau das habe ich vor, aber das braucht halt ein wenig Zeit da ich mich reinlesen muss. Ab Dienstag beginnt meine Lernwoche :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:58 Uhr.

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