Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wieviel Speicher kann ich nutzen? (https://www.delphipraxis.net/64433-wieviel-speicher-kann-ich-nutzen.html)

xaromz 3. Mär 2006 16:37


Wieviel Speicher kann ich nutzen?
 
Hallo,

um einige Dinge zu testen (siehe diesen Beitrag) habe ich versucht, in Delphi dynamisch einen großen String anzulegen.
Sobald der String größer als 1200 MB ist, fliegt mir eine Speicher-Exception um die Ohren.
Sollte ich unter Win32 nicht mindestens 1,5 GB Speicher verwenden können?

Das kann man übrigens leicht ausprobieren:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  P: PAnsiChar;
  C: Integer;
  MBSize: Integer;
begin
  MBSize := 1201; // <- 1200 funktioniert noch
  P := nil;
  try
    P := StrAlloc(MBSize * 1024 * 1024 + 1);

    // Mit Blödsinn füllen
    for C := 0 to MBSize * 1024 * 1024 do
      (P + C)^ := 'A';

  finally
    StrDispose(P);
  end;
end;
Gruß
xaromz

Luckie 3. Mär 2006 16:47

Re: Wieviel Speicher kann ich nutzen?
 
2 GB um genau zu sein. Aber deine Anwendung selber braucht ja auch noch was. ;)

xaromz 3. Mär 2006 16:50

Re: Wieviel Speicher kann ich nutzen?
 
Hallo,
Zitat:

Zitat von Luckie
2 GB um genau zu sein.

mindestens 1,5 GB, weil der PCI-Bus auch noch was haben will.
Zitat:

Zitat von Luckie
Aber deine Anwendung selber braucht ja auch noch was. ;)

Jetzt hoffe ich aber, dass eine VCL-Anwendung mit einem schäbigen Button keine 300 MB verbrät :stupid: .

Gruß
xaromz

Luckie 3. Mär 2006 17:01

Re: Wieviel Speicher kann ich nutzen?
 
Guck im Taskmanager nach.

xaromz 3. Mär 2006 17:14

Re: Wieviel Speicher kann ich nutzen?
 
Hallo,
Zitat:

Zitat von Luckie
Guck im Taskmanager nach.

aber nur, weil Du es bist :wink: :
Zitat:

Zitat von Windows Task Manager
Project1.exe: 3.440 K

Aber das lustige ist ja, wenn das Programm z. B. 4 MB belegt, ist eben bei 1199 MB Schluss.

Gruß
xaromz

Luckie 3. Mär 2006 20:13

Re: Wieviel Speicher kann ich nutzen?
 
Wuird dran liegen dass der Speicherbereich eventuell fragmentiert ist und nicht ehr so viel Speicher in einem Stück alloziiert werden kann.

xaromz 4. Mär 2006 05:38

Re: Wieviel Speicher kann ich nutzen?
 
Hallo,
Zitat:

Zitat von Luckie
Wuird dran liegen dass der Speicherbereich eventuell fragmentiert ist und nicht ehr so viel Speicher in einem Stück alloziiert werden kann.

Fragmentierung des Speichers kommt eigentlich nicht in Frage, sowas gibt's seit Protected Mode nicht mehr. Der Windows-MM gaukelt ja jedem Programm einen linearen Speicherbereich von 0 bis 4 GB vor. Wo die einzelnen Speicherseiten liegen bekommt das einzelne Programm gar nicht mit, die MMU setzt die virtuelle Adresse in die tatsächliche um.
Außerdem ist das Problem auch nach einem Neustart des Rechners noch da. Und wenn es an Fragmentierung läge, wäre es doch ein komischer Zufall, wenn wieder genau 1200 MB am Stück verfügbar wären.

Ich hab natürlich übersehen, dass auch der eigene Adressraum fragmentiert werden kann. Ich bin nur etwas verwundert, wie stark fragmentiert dieser bereits kurz nach dem Start der Anwendung ist.

Kann eigentlich irgendjemand das Problem nachvollziehen?

Gruß
xaromz

Zerolith 4. Mär 2006 08:55

Re: Wieviel Speicher kann ich nutzen?
 
Ich habe den Code ebenfalls probiert. Und bin rel. verwundert.

In meiner Mühle stecken 2 GB. wovon 1,4 definitiv frei sind.

ich kann nicht mal die 1200 Alloziieren. dann habe ich es mit 1000 versucht, hat geklappt. dann mit 1199 nicht geklappt. dann mit 1050 - nicht geklappt. und dann wieder mit 1000 AUCH NICHT MEHR!

irgendwie ist das ganze sehr komisch. Und meines Wissens müsste doch die Speicherverwaltung, wenn ich z.B. "nur" 2GB Speicher habe aber 3 Alloziiere den Rest in die Auslagerungsdatei schreiben?

Basilikum 4. Mär 2006 10:54

Re: Wieviel Speicher kann ich nutzen?
 
wenn du mit obigem Code Memory allozieren möchtest, müsste ja im virtuellen Adressraum die gesamte Grösse zusammenhängend frei sein... da jedoch teilweise stark verzettelt kleine Bereiche bereits belegt sind, ist es glücksache, wie gross der grösste zusammenhängende freie Speicherblock noch ist...

schau dir mal mittels folgendem Code den virtuellen Adressraum deines Prozesses an:
Delphi-Quellcode:
Procedure VMdump();
Var
  Base : Pointer;
  MBI : TMemoryBasicInformation;
  State : String;
  TypeS : String;
begin
  Base:=Nil;
  While (VirtualQuery(Base,MBI,SizeOf(MBI)) > 0) Do Begin
    Case MBI.State Of
      MEM_COMMIT : State:='Commit';
      MEM_FREE : State:='Free';
      MEM_RESERVE : State:='Reserve';
      Else State:='-';
    end;
    Case MBI.Type_9 Of
      MEM_IMAGE : TypeS:='Image';
      MEM_MAPPED : TypeS:='Mapped';
      MEM_PRIVATE : TypeS:='Private';
      Else TypeS:='-';
    end;

    WriteLn(Format('%p..%.8x %.7d %-7s %-7s',[MBI.BaseAddress,LongWord(MBI.BaseAddress) + MBI.RegionSize - 1,MBI.RegionSize div 1024,State,TypeS]));

    Base:=Pointer(LongWord(MBI.BaseAddress) + MBI.RegionSize);
  end;
end;
bei mir war der grösste "Free"-Block ca. 1.2 GB...

wenn du nun in einer Schlaufe kleinere Blöcke allozieren würdest, wären sicherlich gegen 2 GB möglich...

Nicolai1234 4. Mär 2006 11:53

Re: Wieviel Speicher kann ich nutzen?
 
Zitat:

Zitat von Basilikum
schau dir mal mittels folgendem Code den virtuellen Adressraum deines Prozesses an:

Was bedeutet bei dem Code eine solche Zeile?
Zitat:

00AC0000..5B0EFFFF 1480896 Free -

Airblader 4. Mär 2006 12:00

Re: Wieviel Speicher kann ich nutzen?
 
Vermutlich dass der Adressraum zwischen den 2 Adressen (die ersten zwei Werte) eben 1480896 kB (?) groß ist ;)

air

Basilikum 4. Mär 2006 12:02

Re: Wieviel Speicher kann ich nutzen?
 
Zitat:

Zitat von Nicolai1605
Zitat:

Zitat von Basilikum
schau dir mal mittels folgendem Code den virtuellen Adressraum deines Prozesses an:

Was bedeutet bei dem Code eine solche Zeile?
Zitat:

00AC0000..5B0EFFFF 1480896 Free -

Code:
Adressbereich      Grösse (kB) Status Type
00AC0000..5B0EFFFF 1480896      Free   -
im virtuellen Memory an der Adresse 00AC0000 bis 5B0EFFFF liegt ein freier Bereich mit der Länge von 1'680'896 kB (1.6 GB)...

xaromz 4. Mär 2006 13:12

Re: Wieviel Speicher kann ich nutzen?
 
Hallo,

nach Betrachten des virtuellen Adressraums wird mir einiges klarer. Es sind tatsächlich nur ca. 1200 MB zusammenhängend frei.
Bleibt die Frage, warum sind mittendrin überall 4, 8, 16,... Bytes reserviert? Geht das nicht geschickter?

Gruß
xaromz

Basilikum 4. Mär 2006 17:35

Re: Wieviel Speicher kann ich nutzen?
 
Zitat:

Zitat von xaromz
Hallo,

nach Betrachten des virtuellen Adressraums wird mir einiges klarer. Es sind tatsächlich nur ca. 1200 MB zusammenhängend frei.
Bleibt die Frage, warum sind mittendrin überall 4, 8, 16,... Bytes reserviert? Geht das nicht geschickter?

Gruß
xaromz

das sind allesamt irgendwelche Windows-Dlls die leider etwas ungeschickt platziert werden... man müsste irgendwie eine Relokation erzwingen, was aber schwierig werden dürfte, da diese Dlls bereits während der Initialisierung des Prozesses geladen werden...
obwohl: ob es überhaupt einen sinnvollen Grund gibt, 1 GB am Stück im RAM zu halten, würde ich bezweifeln... da würde sich ein File-Mapping im Swap-File anbieten und nach Bedarf Segment-weise in den virtuellen Adressraum einblenden lassen....

xaromz 4. Mär 2006 19:02

Re: Wieviel Speicher kann ich nutzen?
 
Hallo,
Zitat:

Zitat von Basilikum
das sind allesamt irgendwelche Windows-Dlls die leider etwas ungeschickt platziert werden... man müsste irgendwie eine Relokation erzwingen, was aber schwierig werden dürfte, da diese Dlls bereits während der Initialisierung des Prozesses geladen werden...

Blöde Sache, das.
Zitat:

Zitat von Basilikum
obwohl: ob es überhaupt einen sinnvollen Grund gibt, 1 GB am Stück im RAM zu halten, würde ich bezweifeln... da würde sich ein File-Mapping im Swap-File anbieten und nach Bedarf Segment-weise in den virtuellen Adressraum einblenden lassen....

Ich wüsste jetzt gerade auch keine Anwendung, mir ist das nur zufällig aufgefallen. Aber warum sollte man nicht mal große Daten in den Speicher laden, z. B. wenn man die Daten mehrmals hintereinander durchlaufen muss? Wofür hab' ich denn auf paar GB im Rechner stecken :wink:

Gruß
xaromz

Basilikum 4. Mär 2006 20:20

Re: Wieviel Speicher kann ich nutzen?
 
Zitat:

Zitat von xaromz
Ich wüsste jetzt gerade auch keine Anwendung, mir ist das nur zufällig aufgefallen. Aber warum sollte man nicht mal große Daten in den Speicher laden, z. B. wenn man die Daten mehrmals hintereinander durchlaufen muss? Wofür hab' ich denn auf paar GB im Rechner stecken :wink:

oke, das ist ein Grund: wenn man es schon hat, will man es auch ausnutzen... ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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 by Thomas Breitkreuz