AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Frage zu Out of Memory Error (Ältere Delphi Version)
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zu Out of Memory Error (Ältere Delphi Version)

Ein Thema von TheGroudonx · begonnen am 13. Aug 2023 · letzter Beitrag vom 13. Aug 2023
Antwort Antwort
Seite 1 von 2  1 2      
TheGroudonx

Registriert seit: 21. Mai 2014
44 Beiträge
 
#1

Frage zu Out of Memory Error (Ältere Delphi Version)

  Alt 13. Aug 2023, 08:21
Hi,

Ich habe folgenden einfachen Code den ich in Delphi (Windows) ausführe:

var i : Integer; anArray : Array of String;
for i := 0 to 1000000 do
begin

setLength(anArray, length(anArray) + 1);
anArray[length(anArray) - 1] := intToStr(random(100000000));

end;

Ich frage mich nun, wieso das in einem Out of Memory (Zu wenig Arbeitsspeicher) endet.
Würde Ich stattdessen das array nur einmal auf die Größe 1000000 setzen, gäbe es erstmal keinen solchen Fehler (Das ist aber nicht die gesuchte Lösung hier).
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
711 Beiträge
 
Delphi XE5 Professional
 
#2

AW: Frage zu Out of Memory Error (Ältere Delphi Version)

  Alt 13. Aug 2023, 08:56
Hallo,
bei mir läuft Dein Code ohne jedwede Fehlermeldung.
Vielleicht liegt die Ursache außerhalb der obigen Schleife (verschleppter Fehler, nicht freigegebene dynamische Arrays?)
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)

Geändert von Andreas13 (13. Aug 2023 um 08:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Frage zu Out of Memory Error (Ältere Delphi Version)

  Alt 13. Aug 2023, 09:01
Sorgt nicht ein SetLength dafür das erst Platz für neue größe (durchgehender Adressraum) geschaffen wird und dann das alte Array dorthin kopiert wird?
D.h. du brauchst auf jedenfall mehr RAM als wenn du direkt die maximale Zielgröße anforderst.
Das zusammen mit den sehr einfach gestrickten MemoryManager von alten Delphis (hier war FastMM4 ein absolute Notwendigkeit) ist das Problem zu erklären.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
TheGroudonx

Registriert seit: 21. Mai 2014
44 Beiträge
 
#4

AW: Frage zu Out of Memory Error (Ältere Delphi Version)

  Alt 13. Aug 2023, 10:16
Der Fehler tritt definitiv in diesem Code auf, also es liegt nicht an Code der davor ausgeführt werden würde (vlg. hier).
Es ist gut möglich (und hoffentlich der fall), dass es in neueren Delphi Versionen nicht mehr zu diesem Fehler kommt.

Ich nehme an, in einer älteren Version habe Ich dann keine andere Alternative, als auf zu häufiges ändern der Array Größe zu verzichten?
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
711 Beiträge
 
Delphi XE5 Professional
 
#5

AW: Frage zu Out of Memory Error (Ältere Delphi Version)

  Alt 13. Aug 2023, 10:29
Welche Delphi-Version verwendest Du?

..keine andere Alternative, als auf zu häufiges ändern der Array Größe zu verzichten?
Eine brauchbare Krücke wäre, das Array von Anfang an auf die endgültige Grüße zu dimensionieren und nur es nur teilweise zu belegen. Dann müßtest Du selber über die Array-Belegung durch eine weitere Integer-Variable manuell Buch führen.
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.013 Beiträge
 
Delphi 12 Athens
 
#6

AW: Frage zu Out of Memory Error (Ältere Delphi Version)

  Alt 13. Aug 2023, 10:33
Eventuell genügt es, einmal dem Array eine maximale Größe zuzuweisen und dann nur noch kleinere Werte (aber größer als 0) zu setzen. Aber ich kann aktuell auch nicht sagen, ob das in Delphi 7 was bewirkt.

Im Array werden ja auch nur die Pointer auf die Strings gespeichert, die natürlich auch dynamischen Speicherbereich benötigen. Ich vermute, dass dies zu einer Zerstückelung des Speichers führt, bei der dann irgendwann keine großen Blöcke mehr verfügbar sind.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.349 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Frage zu Out of Memory Error (Ältere Delphi Version)

  Alt 13. Aug 2023, 10:58
Ich nehme an, in einer älteren Version habe Ich dann keine andere Alternative, als auf zu häufiges ändern der Array Größe zu verzichten?
Den Fehler solltest du auch in neueren Delphiversionen vermeiden, da es auch mit der besten Optimierung unvermeidbar deutlich langsamer ist.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
711 Beiträge
 
Delphi XE5 Professional
 
#8

AW: Frage zu Out of Memory Error (Ältere Delphi Version)

  Alt 13. Aug 2023, 11:11
Ich möchte Sebastian ausdrücklich beipflichten!
Seit Delphi 5 verwende ich einen ähnlichen Trick bei der Nullstellen-Suche von Funktionen mit sehr vielen Nullstellen: z. B. Bessel-Funktionen bei der instationären Wärmeübertragung, die je nach Anwendungsfall zwischen 0 und tausenden Lösungen haben können. Um nicht bei jeder neuen Nullstelle das Array mit den Lösungen neu dimensionieren (und intern den Inhalt u. U. stets umkopieren) zu müssen, mach ich z. B. 50-er Sprünge bei SetLength(..) . Das ist deutlich schneller und verhindert die noch schlimmere Fragmentierung des Heap.
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.147 Beiträge
 
Delphi 12 Athens
 
#9

AW: Frage zu Out of Memory Error (Ältere Delphi Version)

  Alt 13. Aug 2023, 13:06
Ja, Arrays sind immer zusammenhängend im Speicher.
Bei mehrdimensionalen dynamischen Arrays betrifft das jede Ebene/ParentLevel einzeln. (statische Arrays sind auch über alle Level immer zusammenhängend)

Und ja, wenn das Array der Speicher vergrößert wird, wird jeweils eine völlig neue Kopie erstellt,
also neuer Speicher, Inhalt rüberkopieren und das alte Freigeben.



Ich glaube auch das SetLength wurde später nochmal etwas verbessert, so dass es größere Bereiche neu reservert und dann die nächsten paar Durchläufe nichts machen muß.
Und natürlich der optimalere Speichermanager, aber bei größeren Blöcken gibt es zwischen altem und neuem Manager praktisch keine Unterschiede.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (13. Aug 2023 um 15:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.147 Beiträge
 
Delphi 12 Athens
 
#10

AW: Frage zu Out of Memory Error (Ältere Delphi Version)

  Alt 13. Aug 2023, 13:16
Unabhängig davon, dass dieses Vorgehen eh bestraft gehört (was die Speicherverwaltung hier übernimmt)
ist es einfach nur schwachsinnig so oft nutzlos den Speichermanager zu beschäftigen.


Du hast also gleichzeitig 1-2 große Speicherblöcke (das Array),
eine Masse an kleinen Speicherblöcken (die vielen Strings)
und zussätzlich noch im Speicher verteilt anderes Zeugs, wie die EXE, DLLs usw.

Wie im alten DelphiMM Speicher verteilt ist ... tja, könnte man mal nachsehn.
https://www.delphipraxis.net/1525208-post13.html
Im aktuellen FastMM ist kleiner und großer Speicher bestimmt aus diesem Grunde möglichst voneinander getrennt.


PS: Die 4-GB-Option (LargeAddressAware) ist auch im alten Delphi nutzbar, aber es ist nicht wirklich die Lösung,
denn das Array ist eigentlich bloß 1000000*SizeOf(Integer)+8 * 2 groß, also lediglich 4 und kurzzeitig 8 MB.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (13. Aug 2023 um 15:26 Uhr)
  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 20:04 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