AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamische Arrays - Overhead

Ein Thema von blablab · begonnen am 24. Okt 2009 · letzter Beitrag vom 25. Okt 2009
Antwort Antwort
Seite 2 von 4     12 34      
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 17:17
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.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#12

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 17:19
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 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 von blablab:
@alzaimar:Sorry, dass ich das net weiter rechtfertige, aber es ist kein Designfehler...
Wenn Du meinst. Würde nur gern wissen, was derjenige, der sich das anschauen muss, verbrochen hat.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.171 Beiträge
 
Delphi 12 Athens
 
#13

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 17:24
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#14

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 17:28
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 von alzaimar:
Zitat von blablab:
@alzaimar:Sorry, dass ich das net weiter rechtfertige, aber es ist kein Designfehler...
Wenn Du meinst. 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
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 17:47
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.171 Beiträge
 
Delphi 12 Athens
 
#16

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 17:49
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#17

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 17:56
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

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".
  Mit Zitat antworten Zitat
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#18

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 18:07
Das liegt vermutlich eher an einem Speicherleck beim Befüllen als am Array selber (bzw. wenn kein Speicherleck - was steckt denn hinter dem Pointer?)
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#19

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 18:30
Die 88MB entstehen auch schon ohne dass ich das Array befülle. Das liegt nur am SetLength.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.171 Beiträge
 
Delphi 12 Athens
 
#20

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 18:59
klar, denn die Datenplätze (Variablen) sind auch vorhanden, selbst wenn du nichts da reinschreibst

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 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