Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Zu wenig Arbeitsspeicher


kurt59 - Di 15.01.08 18:58
Titel: Zu wenig Arbeitsspeicher
Hallo

Beim Beschreiben einer neuen Zeile eines Stringgrids (17 Spalten) kommt nach ca 367000 Zeilen
die Fehlermeldung "Zu wenig Arbeitsspeicher".
Ein anschließendes setlength(x,y) einer anderen Funktion bringt die gleiche Fehlermeldung;

Lt. Task-Manager liegt die Speicherauslastung des Programms bei 752756kB
Die Abfrage GlobalMemoryStatus(MS) / MS.dwAvailPhys ergibt ca. 662MB - stimmt mit Task-Manager überein.
Hauptspeicher: 2GB - keine Auslagerungsdatei

Wo liegt mein Problem?

mfG
Kurt


LorenzS - Di 15.01.08 19:02

meinst du mit 752756kB, Speicherauslastung oder Virtueller Speicher?
edit:
ich weis es gibt 2 spalten beim taskmanager, Speicherauslastung und Virtueller Speicher

besser gefragt, nicht wieviel speicher er gerade verbraucht sonder wieviel speicher will er Reservieren wenn die Meldung "Zu wenig Arbeitsspeicher" kommt.


kurt59 - Di 15.01.08 19:09

752756kB wird in der Spalte "Speicherauslastung" der Prozesse
im Task-Manager angezeigt.


Gausi - Di 15.01.08 20:11

Wie oft wird denn Setlength(x,y) ausgeführt? Und wovon wird da immer die Länge verändert?


kurt59 - Di 15.01.08 21:23


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var ordner: array of string;  //Liste mit Verzeichnissen

try
 .
 setlength(ordner,10);
 .
 .
except
  on E: Exception do
  begin
    form1.memo1.lines.add(E.Message);   //Fehlermeldung ausgeben
    status:=0;
  end;
end;


Fehler tritt nur dann auf, wenn vorher eine Exception EOutOfMemory beim
Ändern eines Stringgrids aufgetreten ist.
Vor dem Fehler wurde schon setlength(ordner,132200) oder setlength(ordner,1) ausgeführt,
nur gab es das Problem nicht.

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


DrRzf - Di 15.01.08 22:00

367000 Zeilen in einem StringGrid ?

Ist sowas überhaupt sinnvoll ? :gruebel:
Sollte man sich hier, wenn das proggie schon 750Mb Arbeitsspeicher braucht nicht eine evtl andere Vorgehensweise zurechtbiegen ?


LorenzS - Di 15.01.08 22:03

hört sich fast wie ne verschleppte exception an die nicht behandelt wurden, dann löste sie die nächste try except aus. also die frage was passiert da zwischen!?

Ja, dafür lohnt sich schon ne kleine DB und DBgrid


Bernhard Geyer - Di 15.01.08 22:30

Hört sich nach Fragmentierungsproblem des Default-Speichermanagers an. Hatten wir auch mal (Und wir brauchen einige 100 MB an speicher da wir mit DB's im x-GB-Bereich hantieren müssen und teilweise zur beschleunigung Cachingmechanismen eingebaut haben)
Probier mal FastMM4 (http://sourceforge.net/projects/fastmm). Hat uns von diesen Problemen befreit.


Delete - Mi 16.01.08 10:14
Titel: Re: Zu wenig Arbeitsspeicher
user profile iconkurt59 hat folgendes geschrieben:
Hauptspeicher: 2GB - keine Auslagerungsdatei

Windows NT basierende Systeme sind für das vorhanden sein einer Auslagerungsdatei optimiert, siehe Funktionsweise des Windows Speichermanagers. Das Deaktivieren der selbigen ist demnach suboptimal. Warum hast du sie deaktiviert?


jaenicke - Mi 16.01.08 13:06

Ich würde lieber eine Komponente wie TVirtualTreeView [http://www.delphi-gems.com/index.php?option=com_content&task=view&id=12&Itemid=38] benutzen, die gerade bei extrem vielen Einträgen deutlich schneller ist.

Und da du aus irgendwelchen Gründen (zuwenig Festplattenplatz?) eben die Auslagerungsdatei deaktiviert hast, musst du ja zunächst mal den Speicherverbrauch deines Programms deutlich reduzieren. Aber sinnvoll ist das natürlich auch, wenn man kein kastriertes sondern ein normal arbeitendes und funktionierendes System mit Auslagerungsdatei hat, weil das Programm einfach deutlich schneller sein dürfte.

Je nachdem wo die Daten der Einträge gespeichert sind, kann eine VirtualTreeView sehr viel bis extrem viel schneller arbeiten als ein StringGrid oder eine Original-ListView.


kurt59 - Mi 16.01.08 19:07

Hab jetzt wieder die Auslagerungsdatei aktiviert (3GB).
Beim Eintragen von Daten in das Stringgrid kommt noch immer
die Fehlermeldung "Zu wenig Arbeitsspeicher".
Lt. Task-Manager sind noch 967MB physikalischer Speicher verfügbar.
Werd vieleicht TVirtualTreeView ausprobieren.

Zum Testen ein winziges Programm mit diesem Fehler.


LorenzS - Mi 16.01.08 19:13

ein programme kann je nach Windows Einstellungen nur 2 oder 3 GB benutzen.
selbst bei D3 gibt es bei 740MB Virtuell und 240MB Speicherauslastung ne exception;

Lösungsvorschlag:(dann geht es ohne exception)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button1Click(Sender: TObject);
var x,y:integer;
begin
 y:=0;
 try
  form1.StringGrid1.Cells[4,999999]:='01234567890123456789012345678901234567890123456789';
...


Durch das lineare beschreiben des Stringgrids wird das grid ständig mit Reallocmem Vergrössert. und bei dem Reallocmem aufruf, wird erst der neue speicher reserviert, danach erst die alte grösse aus dem Speicher gelöscht. zB wenn man ne variable von 1000MB auf 1100MB vergrösseren will, würden kurzeitig 2100NB Speicher benötigt und normal ist die grenze bei 2048MB breits überschritten, also exception.


OlafSt - Fr 18.01.08 10:15

Ich würde mal ein anderes Grid versuchen (VirtualTreeView oder das von BergSoft.net, das wir hier einsetzen).