Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dynamische Arrays - Overhead (https://www.delphipraxis.net/142251-dynamische-arrays-overhead.html)

blablab 24. Okt 2009 17:17

Re: Dynamische Arrays - Overhead
 
Kann man nicht irgendwie statische arrays benutzen? sowas wie

Delphi-Quellcode:
procedure unmöglich(count: integer);
var Arr: array of array[0..count] of integer;
begin
   SetLength(Arr, 10000);
   ...
end;
weil sonst muss ich halt des verwenden:
Delphi-Quellcode:
procedure nichtunmöglich(count: integer);
var Arr: array of integer;
begin
   SetLength(Arr, 10000*count);
   ...
end;
mir wärs aber schon lieber wenn ich gescheite Datenstrukturen verwenden könnte...

@Medium: das geht in meinem Fall leider net.

alzaimar 24. Okt 2009 17:19

Re: Dynamische Arrays - Overhead
 
Ich glaub aber, deine Rechnung ist nicht ganz korrekt:
Delphi-Quellcode:
ARR2 = record
   cont: Pointer;
   strs: array of integer;
end;
ARR1 = array of ARR2;
Ein ARR2-Record belegt 8 Bytes. Die 24 Spalten extra sind nochmal 24*4 Bytes plus einen kleinen Overhead für die Größeninformation des 'strs'-Arrays, schätze ich. Macht also pro Record 104 Bytes. Sind dann immer noch 3MB plus -sagen wir- 200k für diesen Oberhead. Oder 400k oder 1MB, völlig wurscht.
Zitat:

Zitat von blablab
Ich brauch 88MB Arbeitsspeicher

Woher weisst Du das? Vielleicht ist hier dein Denkfehler? Und selbst wenn es so wäre. Was solls? Ksnn wirklich an der Speicherfragmentierung liegen.

Zitat:

Zitat von blablab
@alzaimar:Sorry, dass ich das net weiter rechtfertige, aber es ist kein Designfehler...

Wenn Du meinst. :zwinker: Würde nur gern wissen, was derjenige, der sich das anschauen muss, verbrochen hat.

himitsu 24. Okt 2009 17:24

Re: Dynamische Arrays - Overhead
 
korrekt isses eh nicht, denn ich komme auf 3,8 MB (inklusive der Verwaltungsdaten für die Arrays)


Delphi-Quellcode:
procedure möglich(count: integer);
var Arr: array of array[0..10000] of integer;
begin
   SetLength(Arr, count);
   ...
end;
Delphi-Quellcode:
procedure möglich(count: integer);
var Arr: array[0..10000] of array of integer;
  i: Integer;
begin
   for i := Low(Arr) to High(Arr) do
     SetLength(Arr[i], count);
   ...
end;

PS: klar gibt es fast immer einen gewissen Overhead
die Speichermanager reservieren nunmal in gerundeten Größen

bei Windows-Manager kann man Speicher in 4 KB-Schritten anfordern und bis auf den nächsten 64-KB-Schritt kann da nichts mehr reserviert werden.

der DelphiMM verwalten dagengen zwar kleinere Bereiche, aber auch diese sind "genormt"
und dann holt sich Delphi bei Windows den Speicher.

also selbst wenn man nur 1 Byte reserviert, dann ist immer mehr belegt.

blablab 24. Okt 2009 17:28

Re: Dynamische Arrays - Overhead
 
stimmt, die rechnung ist wirklich nicht ganz korrekt. ich habs ja auch nur überschlagen. machen wir aus den 3MB 4MB, dann sinds aber immernoch mehr als das 20fache...

die 88MB hab ich so ermittelt:
1) ARR1 befüllen mit daten
2) Taskmanager öffnen, Speicherbedarf abschreiben
3) Knopf mit Funktion SetLength(ARR1, 0) klicken
4) neuer Speicherbedarf (laut Taskmanager) von vorherigem abziehen
-> 88MB

Zitat:

Zitat von alzaimar
Zitat:

Zitat von blablab
@alzaimar:Sorry, dass ich das net weiter rechtfertige, aber es ist kein Designfehler...

Wenn Du meinst. :zwinker: Würde nur gern wissen, was derjenige, der sich das anschauen muss, verbrochen hat.

Man kann die Tabelle filtern, so dass nurnoch wenige Einträge angezeigt werden

blablab 24. Okt 2009 17:47

Re: Dynamische Arrays - Overhead
 
Bleibt mir jetzt nurnoch übrig
a) das 20-fache an Speicher zu brauchen
b) meine Datenstruktur aufzugeben und alles in einen Riesen array of Pointer umzuwandeln?
:cry:

himitsu 24. Okt 2009 17:49

Re: Dynamische Arrays - Overhead
 
du weißt aber schon, daß ein dynamisches Array schon ein Pointer ist?

Abgesehn davon heißt es noch lange nicht, daß die 80 MB an mehr auch wirklich von dir belegt sind.

Denn es gibt da 2 Arten von Overherad:
- Speicher, welcher wegen Größengruppierung (aufrunden) mitreserviert wurde und nicht mehr nutzbar ist
- Speicher, welcher wegen Gruppenbildung zwar mitreserviert wurde, aber dennoch für andere Variablen nutzbar ist

blablab 24. Okt 2009 17:56

Re: Dynamische Arrays - Overhead
 
Zitat:

Zitat von himitsu
du weißt aber schon, daß ein dynamisches Array schon ein Pointer ist?

Ich versteh nicht was du mir damit sagen möchtest :stupid:

Zitat:

Zitat von himitsu
Abgesehn davon heißt es noch lange nicht, daß die 80 MB an mehr auch wirklich von dir belegt sind.

Denn es gibt da 2 Arten von Overherad:
- Speicher, welche Größengruppierung mitreserviert wurde und nicht mehr nutzbar ist
- Speicher, welcher wegen Gruppenbildung zwar mitreserviert wurde, aber dennoch für andere Variablen nutzbar ist

Das problem ist halt, sobald ich mehr Reihen/Spalten hab stürzt mein Programm ab mit der Meldung "Nicht genügend Arbeitsspeicher".

Tryer 24. Okt 2009 18:07

Re: Dynamische Arrays - Overhead
 
Das liegt vermutlich eher an einem Speicherleck beim Befüllen als am Array selber (bzw. wenn kein Speicherleck - was steckt denn hinter dem Pointer?)

blablab 24. Okt 2009 18:30

Re: Dynamische Arrays - Overhead
 
Die 88MB entstehen auch schon ohne dass ich das Array befülle. Das liegt nur am SetLength.

himitsu 24. Okt 2009 18:59

Re: Dynamische Arrays - Overhead
 
klar, denn die Datenplätze (Variablen) sind auch vorhanden, selbst wenn du nichts da reinschreibst :zwinker:

einfache Lösung gegen eine übermäßige Defragmentierung,
denn genau das ist einer der Gründe, warum man nicht unbedingt ein Array oft in seiner Größe verändern sollte:
einfach den gesamten Speicher gleich am Anfang auf Einmal reservieren
und dann die Daten nur noch da reinschreiben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 Uhr.
Seite 2 von 4     12 34      

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