Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   SetLength -> Zu wenig Arbeitsspeicher? (https://www.delphipraxis.net/153654-setlength-zu-wenig-arbeitsspeicher.html)

AJ_Oldendorf 11. Aug 2010 11:31

SetLength -> Zu wenig Arbeitsspeicher?
 
Hallo zusammen,
laut Suchfunktion bin ich ja nicht der erste der das Problem hat.
Ich habe das Problem, dass wenn meine Anwendung lange läuft (paar Tage), dass irgendwann sporadisch bei folgenden Aufruf

Delphi-Quellcode:
var
  aLaenge : Integer;
begin
  aLaenge := 77; //Beispiel

  try
    SetLength(InputMsg^, 12+aLaenge);
  except
    on E: Exception do
    begin
      ErrorStr := 'Aufruf von SetLength():';
    end;
  end;
end;
eine Exception entsteht mit "zu wenig Arbeitsspeicher".
Es ist aber noch genug Speicher verfügbar laut TaskManager (auch virtueller Speicher).
Die Frage ist, wie kann sowas entstehen bzw. wie kann man dies evtl. verbessern / abändern?
Ich verwende Delphi 2009 und die Anwendung läuft auf Win2003 Server.

Wäre für jeden Tip dankbar.

Viele Grüße
Alex

PS: InputMsg wird als PAnsiString in diese Funktion übergeben...

Neutral General 11. Aug 2010 11:37

AW: SetLength -> Zu wenig Arbeitsspeicher?
 
Hallo,

Ist die neue Länge des Strings abhängig von seiner alten Länge? d.h. benutzt du Length um die neue Länge zu bestimmen? Und bist du dir sicher, dass du einen gültigen PAnsiString übergibst?

himitsu 11. Aug 2010 11:40

AW: SetLength -> Zu wenig Arbeitsspeicher?
 
Delphi kann, bzw. Win32-Anwendungen können standardmäßig nur maximal 2 GB an "virtuellem" Speicher verwalten ... ist der voll, dann knallt's

Ich vermute mal du hast ein Speicherleck, durch dein Rumgepointere oder Anderswo.


Scheib mal
Delphi-Quellcode:
ReportMemoryLeaksOnShutdown := True;
in den Constructor deiner Form.

hoika 11. Aug 2010 11:41

AW: SetLength -> Zu wenig Arbeitsspeicher?
 
Hallo,

ich sehe keine Funktion, nur etwas Code.
Und der reicht nicht (Laenge nicht definiert).


Heiko

AJ_Oldendorf 11. Aug 2010 11:45

AW: SetLength -> Zu wenig Arbeitsspeicher?
 
also die Variable ist defintiv gültig.
@hoika, das müsste aLaenge heißen in dem Code (habs geändert).
Ist ja auch nur der Inhalt der Funktion (ohne Funktionskopf).
Kann man an diesen "maximal 2 GB" etwas machen oder kommt man da nicht rum?
Was ist, wenn die Anwendung aber mit der Zeit immer mehr Daten im Bauch halten muss?

Gruß
Alex

freak4fun 11. Aug 2010 11:49

AW: SetLength -> Zu wenig Arbeitsspeicher?
 
Zitat:

Zitat von AJ_Oldendorf (Beitrag 1041110)
Was ist, wenn die Anwendung aber mit der Zeit immer mehr Daten im Bauch halten muss?

Dann bekommt deine Anwendung und du Bauchschmerzen und du musst dein konzept eventuell überdenken. :)

mleyen 11. Aug 2010 11:51

AW: SetLength -> Zu wenig Arbeitsspeicher?
 
Zitat:

Zitat von AJ_Oldendorf (Beitrag 1041110)
Was ist, wenn die Anwendung aber mit der Zeit immer mehr Daten im Bauch halten muss?

Dann lager zwichenzeitlich Daten auf der Festplatte aus.

AJ_Oldendorf 11. Aug 2010 11:53

AW: SetLength -> Zu wenig Arbeitsspeicher?
 
Ok verstehe ich aber das kann ja wohl keine Lösung sein oder?
Ich sag mal ganz krass, wenn ich viele Stringlisten mit vielen Objekten oder Zeigern habe, dann ist es doch keine Lösung "einfach" bei 2GB den Riegel vor die Tür zu schieben wenn mein Rechner doch 4GB hat...
Macht doch kein Sinn oder?

Gruß
Alex

AJ_Oldendorf 11. Aug 2010 11:54

AW: SetLength -> Zu wenig Arbeitsspeicher?
 
ist der verfügbare Speicher evtl. "nur" fragmentiert? kann man da vielleicht ansetzen und irgendwas machen?

Neutral General 11. Aug 2010 11:56

AW: SetLength -> Zu wenig Arbeitsspeicher?
 
Zitat:

Zitat von AJ_Oldendorf (Beitrag 1041114)
Ok verstehe ich aber das kann ja wohl keine Lösung sein oder?
Ich sag mal ganz krass, wenn ich viele Stringlisten mit vielen Objekten oder Zeigern habe, dann ist es doch keine Lösung "einfach" bei 2GB den Riegel vor die Tür zu schieben wenn mein Rechner doch 4GB hat...
Macht doch kein Sinn oder?

Gruß
Alex

Doch macht es. Die anderen 2GB werden mehr oder weniger vom Betriebssystem benötigt. Ich glaube es gibt sogar irgendeinen Tick mit dem man auf 3GB oder so aufstocken kann, aber im Normalfall ist es wirklich so, dass man damit gut auskommen sollte. Wenn du nicht damit auskommst, dann solltest du tatsächlich deinen Code überdenken.

Also wenn ich ein Programm im Taskmanager sehen würde, was 2GB Speicher verbraucht, dann wär das aber ganz schnell abgeschossen....


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:50 Uhr.
Seite 1 von 4  1 23     Letzte »    

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