Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Array ohne Stack Overflow / nicht genügend Arbeitsspeicher (https://www.delphipraxis.net/117777-array-ohne-stack-overflow-nicht-genuegend-arbeitsspeicher.html)

cramer 24. Jul 2008 18:03


Array ohne Stack Overflow / nicht genügend Arbeitsspeicher
 
Hallo,
bei der Suche nach einer Array-Lösung bin auf folgenden Beitrag gestoßen: " nicht genügend arbeitspeicher verfügbar von: easteregg "
Er hat seinerzeit aufgegeben und da ich keine weiteren Beiträge zum Problem gefunden habe, möchte ich allen, die noch nach einer Lösung suchen, diesen Hinweis nicht vorenthalten.

Mein System hat 2GB RAM und läuft unter WinXpSp3. Das Problem lag an einem zu kleinen DesktopHeap-Eintrag.

Original:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\Session Manager\SubSystems (Windows=%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16)

Changed:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\Session Manager\SubSystems (Windows=%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,8192,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16)

Seither gehört die Meldung der Vergangenheit an.

Nun aber zu meiner eigentlichen Frage (BDS2006)
Ich benötige ein 1MB Array of Byte in etwa so
var
// buffer : array [0..1048575] of Byte; // 1M geht aber nicht, Overflow Exception
// buffer : array [0..65535] of Byte; // 64K geht
// buffer : array [0..262143] of Byte; // 256K geht auch noch

Gibt es für 1MB ein Lösung ?
Falls nicht und ich begnüge mich mit 256K, kann es auf anderen Systemen trotzdem zu einem Overflow kommen ?
Thanks in advance

Dax 24. Jul 2008 18:13

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich
 
Delphi-Quellcode:
buffer: array of Byte;
begin
  SetLength(buffer, 1024*1024);
Dynamisches Array heisst das - statische lokale Arrays wandern auf den begrenzten Stack, dynamische Arrays wandern immer auf den Heap (und der ist riesig).

cramer 24. Jul 2008 18:24

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich
 
Super, danke, eingebaut, getestet, kein Overflow, aber
sizeof(buffer) gibt wohl 4 Byte (den Pointer oder so) zurück,
geht aber bestimmt auch anders oder ?

Klaus01 24. Jul 2008 18:28

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich
 
Hallo,

length(array) sollte gehen,
den obersten Wert bekommst Du mit high(Array) der kleinste sollte 0 sein.

Grüße
Klaus

SirThornberry 24. Jul 2008 19:27

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich
 
Anstelle von sizeof bekommst du die Datengröße von einem dynamischen Array mit Length + sizeof auf ein einzelnes Element:
Delphi-Quellcode:
size := sizeof(yourarray[0]) * Length(yourarray);

Apollonius 24. Jul 2008 19:33

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich
 
Wenn man die Größe sowieso statisch setzt - spricht etwas dagegen, die Stack-Größe in den Projekt-Optionen zu erhöhen?

cramer 25. Jul 2008 07:31

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich
 
Danke für die Tips.
Nun gibt es mit dem dynamischen Array aber einen Range Error bei FileRead
Delphi-Quellcode:
const int64Null : int64 = 0;
var
  qFile : Integer;
  buffersize,size, rest, len : cardinal;
  buffer: array of Byte;
begin
  buffersize := 128*128; // 16K als Beispiel
  SetLength(buffer, BufferSize); // (Edit) Ja, sorry, hatte ich nur nicht in den Beitrag kopiert
  // ... sonstiges Fileopen Geraffel
    qFile := FileOpen(qName,fmOpenRead or fmShareDenyNone);
    if qFile >= 0 then begin
      // Zum Ende um size der Datei zu ermitteln
      size := FileSeek(qFile,int64Null,soFromEnd);
      // Zum Anfang fürs Lesen
      FileSeek(qFile,int64Null,soFromBeginning);

      len := FileRead(qFile,buffer,BufferSize); <-- RangeError

Klaus01 25. Jul 2008 07:59

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich
 
Guten Morgen,

mal eine blöde Frage, aber das Array hast Du auch mit Setlength irgendwo eingestellt?

Grüße
Klaus

Win32.API 25. Jul 2008 08:18

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich
 
Delphi-Quellcode:
len := FileRead(qFile,buffer[0],BufferSize);

cramer 25. Jul 2008 08:35

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich
 
Hi Klaus
(Edit) Ja, sorry, hatte ich nur nicht in den Beitrag kopiert.

Hi Apollonius
Die Version mit einem 2MB Stack in den Projektoptionen funktioniert.
Allerdings würde mir die Dynamische Lösung, wenns funktionieren würde, besser gefallen.

Hi Win32.API
das war die Lösung. Aber warum ?
Bei einem statischen Array wird bei Buffer automatisch die Adresse des ersten Bytes genommen ?
und wohin zeigt denn buffer bei einem Dynamischen Array ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:32 Uhr.
Seite 1 von 2  1 2      

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