Autor |
Beitrag |
kurt59
      
Beiträge: 20
-
Delphi 5
|
Verfasst: 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
      
Beiträge: 128
MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
|
Verfasst: 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 
      
Beiträge: 20
-
Delphi 5
|
Verfasst: Di 15.01.08 19:09
752756kB wird in der Spalte "Speicherauslastung" der Prozesse
im Task-Manager angezeigt.
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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 
      
Beiträge: 20
-
Delphi 5
|
Verfasst: 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; try . setlength(ordner,10); . . except on E: Exception do begin form1.memo1.lines.add(E.Message); 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 Narses: Delphi-Tags hinzugefügt
|
|
DrRzf
      
Beiträge: 260
Win XP Prof
D7 Enterprise
|
Verfasst: Di 15.01.08 22:00
367000 Zeilen in einem StringGrid ?
Ist sowas überhaupt sinnvoll ?
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
      
Beiträge: 128
MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
|
Verfasst: 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
      
Beiträge: 721
Erhaltene Danke: 3
|
Verfasst: 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
|
Verfasst: Mi 16.01.08 10:14
kurt59 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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 20
-
Delphi 5
|
Verfasst: 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
      
Beiträge: 128
MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
|
Verfasst: 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.
Einloggen, um Attachments anzusehen!
|
|
OlafSt
      
Beiträge: 486
Erhaltene Danke: 99
Win7, Win81, Win10
Tokyo, VS2017
|
Verfasst: 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.
|
|