Autor Beitrag
kurt59
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 20

-
Delphi 5
BeitragVerfasst: Di 15.01.08 18:58 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
BeitragVerfasst: 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.


Zuletzt bearbeitet von LorenzS am Di 15.01.08 19:14, insgesamt 1-mal bearbeitet
kurt59 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 20

-
Delphi 5
BeitragVerfasst: Di 15.01.08 19:09 
752756kB wird in der Spalte "Speicherauslastung" der Prozesse
im Task-Manager angezeigt.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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?

_________________
We are, we were and will not be.
kurt59 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 20

-
Delphi 5
BeitragVerfasst: Di 15.01.08 21:23 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260

Win XP Prof
D7 Enterprise
BeitragVerfasst: 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 ?

_________________
rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.
LorenzS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: 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 (sourceforge.net/projects/fastmm). Hat uns von diesen Problemen befreit.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 16.01.08 10:14 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 16.01.08 13:06 
Ich würde lieber eine Komponente wie TVirtualTreeView 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 20

-
Delphi 5
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
BeitragVerfasst: 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)
ausblenden 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.
Einloggen, um Attachments anzusehen!
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Fr 18.01.08 10:15 
Ich würde mal ein anderes Grid versuchen (VirtualTreeView oder das von BergSoft.net, das wir hier einsetzen).

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.