![]() |
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 |
Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich
Delphi-Quellcode:
Dynamisches Array heisst das - statische lokale Arrays wandern auf den begrenzten Stack, dynamische Arrays wandern immer auf den Heap (und der ist riesig).
buffer: array of Byte;
begin SetLength(buffer, 1024*1024); |
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 ? |
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 |
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);
|
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?
|
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 |
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 |
Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich
Delphi-Quellcode:
len := FileRead(qFile,buffer[0],BufferSize);
|
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 04:17 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