![]() |
Re: kleines Programm - riesiger Prozess
Ey das eine Byte... :D
Dann halt (Cardinal div 2)-1 :drunken: |
Re: kleines Programm - riesiger Prozess
Liste der Anhänge anzeigen (Anzahl: 1)
das klappt auch nicht. siehe screenshot!
lass ich alles in der funktion weg, und deklarier nur den typ, dann gehts wiederum. edit: kann das an 512 MB RAM + 7XX MB Pagefile liegen, dass das deshalb nichts wird? aber warum krepiert der dann, bevor er es probiert (keine festplattenzugriffe --> keine pagefile) |
Re: kleines Programm - riesiger Prozess
So:
Delphi-Quellcode:
Bekomme ich eine OutOfMemory Exception.
procedure TForm1.Button1Click(Sender: TObject);
type PDickesDingen = ^TDickesDingen; TDickesDingen = array[0..High(Integer) - 1] of Byte; var Foo: PDickesDingen; begin new(Foo); end; |
Re: kleines Programm - riesiger Prozess
so klappts bei mir auch (mit der "korrekten" exception) aber wieder bevor er überhaupt versucht hat, die pagefile vollzukleistern
|
Re: kleines Programm - riesiger Prozess
Zitat:
Solche Arrays definiert man normalerweise nur als Hilfstypen, um ohne Auslösen der Überlauf/Bereichsprüfung auf Arrays unbekannter Länge zuzugreifen. |
Re: kleines Programm - riesiger Prozess
Okay, jetzt wirds interessant.
Folgendes kompiliert bei mir noch so gerade eben - ein Element mehr, und das Teil bringt eine AV:
Delphi-Quellcode:
Das macht 1.033.648 Elemente á 1 Byte, also ziemlich genau 1 Megabyte.
procedure TForm1.Button1Click(Sender: TObject);
type TDickesDingen = array[0..$FC5AF] of Byte; var Foo: TDickesDingen; i: Integer; begin for i := 0 to Length(Foo)-1 do Foo[i] := 0; end; Der Stack ist auf Max. 1.048.576 Byte. Na, was fällt auf? ;) Ohne Zugriff, also die bloße Deklaration klappt bis 2Gig! Dann dieses:
Delphi-Quellcode:
Wird auch gerade noch korrekt ausgeführt.
procedure TForm1.Button1Click(Sender: TObject);
type PDickesDingen = ^TDickesDingen; TDickesDingen = array[0..$40F2FFF7] of Byte; var Foo: PDickesDingen; begin new(Foo); end; Kombiniert man dies, kann man mit der Schleife tatsächlich durch das Array im 2. Code durchlaufen, da hier ganz offensichtlich nicht der Stack bemüht wird:
Delphi-Quellcode:
Aaaaber: 0..$40F2FFF7 = 1.089.667.064 Byte und das sind 1,015 Gigabyte => Ich habe 1 Gig RAM. Aber das Teil verbrauchte zur Laufzeit nur kurzzeitig > 700MB, und dann rutschte es gewaltig auf ~20 bis 50MB runter, mitten in der Schleife. :gruebel:
procedure TForm1.Button1Click(Sender: TObject);
type PDickesDingen = ^TDickesDingen; TDickesDingen = array[0..$40F2FFF7] of Byte; var Foo: PDickesDingen; i: Integer; begin new(Foo); for i := 0 to Length(Foo^)-1 do Foo^[i] := 0; end; (Messung per Taskmanager :roll:) Es müsste ja theoretisch noch ein Gig mehr gehen... Haut aber partout nicht hin, obwohl mein Pagefile auf 4Gig steht. Auch mit einer 2. Variable dieses Typs und mit new erzeugt führt zu einer "Out of Memory". Wenn ich mich recht erinnere, dann hatte ich schon mal ein 3-dimensionales statisches Array verwendet, bei dem mir die 2 Gig-Grenze begenete, und ich hatte es dann auf "knapp darunter" verkleinert, und auch damit gearbeitet. Allerdings als globale Variable, und somit ja nicht auf dem Stack, und auch nicht als Pointer mit new, sondern direkt - aber wieso ging das hier jetzt nicht? :gruebel: (Kann aber auch sein, dass ich mich irre - ist schon etwas her) Darf also ein Prozess die Größe des vorhadenen RAMs nicht überschreiten, so dass immer die gesamte Prozess rein passt? Dann werden auch immer nur ganze Prozesse ausgelagert?? Wäre doch birnig, oder? Ich schnall's glaub ich nicht :stupid: und geh mal besser ins Bett... |
Re: kleines Programm - riesiger Prozess
okay, danke erstmal.
Ich werde mal meine deklarationen zusammenrechnen und zusätzlich mal schauen, ob meine Typauswahl immer die treffendste war. Dankeschön! |
Re: kleines Programm - riesiger Prozess
Im Taskmanager werden soweit ich weiss auch verwendete DLLs mit angerechnet user32.dll z.B.
Da diese aber eh schon geladen sind, müsstest du dir die allocierten bereiche des Speichers mal genau anschauen und diese Dinge abziehen. Kann dieses Norton Systeminfo z.B. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:42 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