Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   max size von array of byte? (https://www.delphipraxis.net/161414-max-size-von-array-byte.html)

TheGame1492 2. Jul 2011 18:32

max size von array of byte?
 
huhu,

also folgender Code funzt:
Code:
buffer : array[0..1036275] of Byte;
aber ab: 1036276, kommt schon ein StackOverflow.

Kann man da was machen, um ein größeres Array nutzen zu können?

Klaus01 2. Jul 2011 18:37

AW: max size von array of byte?
 
Guten Abend,

a) Stacksize erhöhen
oder
b) dynamische Array benutzen

Grüße
Klaus

EWeiss 2. Jul 2011 18:37

AW: max size von array of byte?
 
Zitat:

Zitat von TheGame1492 (Beitrag 1109669)
huhu,

also folgender Code funzt:
Code:
buffer : array[0..1036275] of Byte;
aber ab: 1036276, kommt schon ein StackOverflow.

Kann man da was machen, um ein größeres Array nutzen zu können?

The amount of memory available depends on:
1. The total memory on the platform.
2. The amount of memory allocated to the program.
3. The compiler's settings.

gruss

himitsu 2. Jul 2011 19:50

AW: max size von array of byte?
 
- Lokale Variablen liegen auf dem Stack.
- Die Daten eines statischen Arrays liegt dort wo seine Variable liegt.
(dynamische Arrays sind ein Zeiger und die Daten auf dem Heap)
- Die Größe des Stacks ist begrenzt.

Lösung: Wenn das Array zu groß ist, nimm ein dynamisches Array.

Aber notfalls könnte man auch den Stack noch etwas vergrößern.


Zitat:

The amount of memory available depends on:
1. The total memory on the platform.
2. The amount of memory allocated to the program.
Nein.

Den Stack sollte man nicht unengdlich Groß machen.
Bei spätestens 10 MB im Stack, liegt definitiv ein Designproblem vor.

Ansonsten: Maximale größe eines dynamischen Array of Byte
- maximal
Delphi-Quellcode:
0 bis 2 GB - 2*SizeOf(Integer) - 1
- maximal der größte zusammenhängende freie Speicherblock

(effektiv maximal 0,7 bis 1,5 GB)

Aphton 2. Jul 2011 21:14

AW: max size von array of byte?
 
schau dir mal folgendes an:
{$MINSTACKSIZE <Value>}
{$MAXSTACKSIZE <Value>}

Weiters: Lass dein Array nich zu groß werden - sonst wird das System instabil / zu langsam - wenn zb. die Anwendung > 1 gb RAM benötgit!

EWeiss 3. Jul 2011 06:24

AW: max size von array of byte?
 
Zitat:

Zitat von himitsu (Beitrag 1109682)
- Lokale Variablen liegen auf dem Stack.
- Die Daten eines statischen Arrays liegt dort wo seine Variable liegt.
(dynamische Arrays sind ein Zeiger und die Daten auf dem Heap)
- Die Größe des Stacks ist begrenzt.

Lösung: Wenn das Array zu groß ist, nimm ein dynamisches Array.

Aber notfalls könnte man auch den Stack noch etwas vergrößern.


Zitat:

The amount of memory available depends on:
1. The total memory on the platform.
2. The amount of memory allocated to the program.
Nein.

Den Stack sollte man nicht unengdlich Groß machen.
Bei spätestens 10 MB im Stack, liegt definitiv ein Designproblem vor.

Ansonsten: Maximale größe eines dynamischen Array of Byte
- maximal
Delphi-Quellcode:
0 bis 2 GB - 2*SizeOf(Integer) - 1
- maximal der Größe zusammenhängende freie Speicherblock

(effektiv maximal 0,7 bis 1,5 GB)

Danke für die Infos kann ich auch sicherlich mal gebrauchen ;)

gruss

Panthrax 3. Jul 2011 09:41

AW: max size von array of byte?
 
Dann lege den Speicher nicht auf den Stack, sondern auf den Heap:
Delphi-Quellcode:
type
  TArray = array[0..0] of Byte;
  PArray = ^TArray;
var
  P: Pointer;
  A: PArray;
begin
  P := GetMem(50 * 1024 * 1024); // 50 MB

  A := P;
  A^[0] := 0;
  A^[1 * 1024 * 1024] := 1;
  A^[2 * 1024 * 1024] := 2;
  A^[2 * 1024 * 1024] := 3;
  // ...

  FreeMem(P);
end;
Das Beispiel ist nur zur Verdeutlichung. Die dafür gedachten Typen sind SysUtils.TByteArray und PByteArray (8 Bit) und TWordArray und PWordArray (16 Bit).

himitsu 3. Jul 2011 09:56

AW: max size von array of byte?
 
Bitte :D

Gilt aber natürlich nur für das 32 Bit-Delphi,
wo man eben nur 2 GB (in Ausnahmefällen 3 GB) virtuellen Speicher pro Prozess hat,
wo auch noch überall in dem verfügaren Speicher DLLs und sonstwas verteilt rumliegen und es so verhindern, daß man einen wirklich großen zusammenhängenden Speicherblock bekommt.

Unter 64 Bit könnte man dagegen wirklich mal einen Block bekommen, wo nur noch der RAM+Auslagerungsdatei die Grenze bilden.


@Panthrax: Aber bitte nicht den Resourcenschutzblock vergessen.
PS: ein dynamisches Array besitzt automatisch einen Resourcenschutzblock und es wird auch automatisch freigegeben.

TheGame1492 3. Jul 2011 12:02

AW: max size von array of byte?
 
thx für die Infos :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:55 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