AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wieviel Speicher kann ich nutzen?

Ein Thema von xaromz · begonnen am 3. Mär 2006 · letzter Beitrag vom 4. Mär 2006
Antwort Antwort
Seite 1 von 2  1 2      
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#1

Wieviel Speicher kann ich nutzen?

  Alt 3. Mär 2006, 16:37
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Wieviel Speicher kann ich nutzen?

  Alt 3. Mär 2006, 16:47
2 GB um genau zu sein. Aber deine Anwendung selber braucht ja auch noch was.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: Wieviel Speicher kann ich nutzen?

  Alt 3. Mär 2006, 16:50
Hallo,
Zitat von Luckie:
2 GB um genau zu sein.
mindestens 1,5 GB, weil der PCI-Bus auch noch was haben will.
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 .

Gruß
xaromz
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Wieviel Speicher kann ich nutzen?

  Alt 3. Mär 2006, 17:01
Guck im Taskmanager nach.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: Wieviel Speicher kann ich nutzen?

  Alt 3. Mär 2006, 17:14
Hallo,
Zitat von Luckie:
Guck im Taskmanager nach.
aber nur, weil Du es bist :
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Wieviel Speicher kann ich nutzen?

  Alt 3. Mär 2006, 20:13
Wuird dran liegen dass der Speicherbereich eventuell fragmentiert ist und nicht ehr so viel Speicher in einem Stück alloziiert werden kann.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#7

Re: Wieviel Speicher kann ich nutzen?

  Alt 4. Mär 2006, 05:38
Hallo,
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
  Mit Zitat antworten Zitat
Zerolith

Registriert seit: 12. Mär 2003
Ort: Kempten
188 Beiträge
 
Delphi 6 Enterprise
 
#8

Re: Wieviel Speicher kann ich nutzen?

  Alt 4. Mär 2006, 08:55
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?
Daniel
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#9

Re: Wieviel Speicher kann ich nutzen?

  Alt 4. Mär 2006, 10:54
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...
  Mit Zitat antworten Zitat
Nicolai1234

Registriert seit: 21. Feb 2004
1.008 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Wieviel Speicher kann ich nutzen?

  Alt 4. Mär 2006, 11:53
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 -
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:23 Uhr.
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