![]() |
Re: Dynamische Arrays - Overhead
Kann man nicht irgendwie statische arrays benutzen? sowas wie
Delphi-Quellcode:
weil sonst muss ich halt des verwenden:
procedure unmöglich(count: integer);
var Arr: array of array[0..count] of integer; begin SetLength(Arr, 10000); ... end;
Delphi-Quellcode:
mir wärs aber schon lieber wenn ich gescheite Datenstrukturen verwenden könnte...
procedure nichtunmöglich(count: integer);
var Arr: array of integer; begin SetLength(Arr, 10000*count); ... end; @Medium: das geht in meinem Fall leider net. |
Re: Dynamische Arrays - Overhead
Ich glaub aber, deine Rechnung ist nicht ganz korrekt:
Delphi-Quellcode:
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.
ARR2 = record
cont: Pointer; strs: array of integer; end; ARR1 = array of ARR2; Zitat:
Zitat:
|
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. |
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:
|
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: |
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 |
Re: Dynamische Arrays - Overhead
Zitat:
Zitat:
|
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?)
|
Re: Dynamische Arrays - Overhead
Die 88MB entstehen auch schon ohne dass ich das Array befülle. Das liegt nur am SetLength.
|
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 15:40 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