Einzelnen Beitrag anzeigen

Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: OutOfMemory Fehler abfangen

  Alt 30. Jul 2016, 10:10
Würde mich auch interessieren, hab das gleiche Problem nämlich beim Drucken unter Nutzung von GDI+. Würde sich das bei Win64 dann erledigen? Konnte ich noch nicht prüfen.
Also bei 64-bit hast du ja viel mehr Arbeitsspeicher zur Verfügung. Von daher sind dort dann solche Probleme weg. Ich weiß nur nie genau, ob man beim Umstieg von 32-bit auf 64-bit an der Art der Programmierung (Datentypen usw.) etwas ändern muss bzw. sollte.

Bei so vielen Daten solltest Du Dir vielleicht auch Gedanken über ein anderes DB-System machen...
Das ist leider nicht möglich. Ich schreibe aktuell ein Programm, dass eine SQLite Datenbank auslesen kann. Also eine Art Management Studio für SQLite. Bevor du (oder jmd. anderes) allerdings sagt, dass es solche Programme schon zu genüge gibt: Ich weiß das. Aber ich würde trotzdem gerne ein eigenes schreiben.

Mein Programm funktioniert ja auch schon, aber es gibt bei so viele Datensätzen eben Speicherprobleme. Allerdings nur in Verbindung mit Strings. Wenn nur Zahlen o.ä. in der Abfrage enthalten sind, dann sind 10Mio Datensätze auch kein Problem.

Ein virtuelles Auslesen der Datenbank ... keine Ahnung wie das gehen soll. Zumindest nicht, ohne jetzt mein komplettes Konzept über den Haufen zu werfen. Das war schon sehr kompliziert, überhaupt eine Struktur zu entwickeln um alle Daten darin zu speichern. Wer genaueres Wissen will, sollte sich das Thema SQLite Typaffinitäten auf der SQLite HomePage anschauen.

Zitat:
kann ich aber meine Struktur im Hintergrund nicht mehr freigeben
Kann man immer an der richtigen stelle.
Wenn die aktuelle Datenbank nicht mehr verwendet wird (Aber ich denke das tust du bereits)
Tja die Datenbank selbst ist ja nicht das Problem. Das ist ja nur ein einziger Pointer der von einer DLL zurückgegeben wird. Problematisch sind die Queries die ausgeführt werden. Aber auch nur die, die der User ausführen kann, weil dort zu viele Datensätze zurückkommen könnten.

Wenn ich jetzt ein SELECT * FROM Daten mache und ein LIMIT 1000 vergesse, dann können da je nach Tabelle viele viele Datensätze zurückkommen. Und das weiß ja auch mein Programm vorher nicht. Es sei denn ich würde einen entsprechenen Count vorher ausführen. Aber dann weiß ich immer noch nicht, wie viel RAM die Daten belegen würden.


Es muss doch eine Möglichkeit geben, aus dem Teufelskreis wieder herauszukommen. Ich kann die Exception ja abfangen, aber jegliche weitere Aktion die ich dann ausführen will, führt zu einer weiteren EOutOfMemory Exception. Könnte ich an der Stelle, ander die Exception ausgelöst wird meine Daten die ich aus der Datenbank ausgelesen habe wieder freigeben, dann wäre das kein Problem. Aber zum Freigeben wird anscheinend auch etwas Speicher benötigt, was dazu führt das es nicht mehr funktioniert. Ich kann nicht mal mehr den User mit einer etwas freundlicheren Meldung informieren. Dafür ist auch kein Speicher mehr frei. Und das Programm selbst muss danach auch über den Taskmanager beendet werden, da es sich mit der Meldung OutOfMemory nicht mehr beenden lässt.

Geändert von Aviator (30. Jul 2016 um 10:12 Uhr)
  Mit Zitat antworten Zitat