![]() |
Datenbank: TurboDB • Version: 5.16 • Zugriff über: TurboDB-Komponenten
Arbeitsspeicherproblem beim speichern in TurboDB-Datenbank
Hallo,
ich habe mir ein kleines Testprogramm geschrieben, das über eine TDBTable-Komponente permanent Daten in eine TurboDB-Datenbank schreibt. Jetzt beobachte ich beim starten der Applikation dass sie immer mehr und mehr an Arbeitsspeicher benötigt, bis Windows sogar anfängt den Arbeitsspeicher auf der Festplatte auszulagern (das passiert aber erst nach ein paar Tagen Dauerbetrieb) Mein Code sieht grob gesagt so aus:
Delphi-Quellcode:
Was genau ist dafür die Ursache und wie kann ich Abhilfe schaffen? Habe es mal mit TDBTable.Refresh; nach dem .Post probiert, aber hat nichts geholfen.
for i:=0 to 9999999 do
begin TdbTable1.Append; //Fill dataset with data for a := 2 to (151) do begin //Insert dword data into table field TdbTable1.Fields[a-1].AsInteger := i; end; //Save dataset to archive-database TdbTable1.Post; end; Besten Dank schonmal! |
Re: Arbeitsspeicherproblem beim speichern in TurboDB-Datenba
Was passiert wenn du zwischenzeitlich die DB-Verbindung schließt?
|
Re: Arbeitsspeicherproblem beim speichern in TurboDB-Datenba
das kann ich mir aus Performancegründen leider nicht erlauben :/ Aber ich habe es mal getestet, und wie es aussieht benötigt er trotzdem von Zeit zu Zeit immer mehr Arbeitsspeicher.
*edit* es scheint als pendelt er sich doch bei einer Obergrenze ein wenn ich ständig connecte/disconnecte. *edit2* Wenn mein Programm ein paar Stunden läuft benötigt er 190MB RAM. Setze ich dann alle Table-Komponenten auf Active := FALSE, benötigt er immer noch 190MB. Setze ich sie danach wieder auf TRUE, macht er bei 190MB weiter. Schon komisch... |
Re: Arbeitsspeicherproblem beim speichern in TurboDB-Datenba
dann bau das Programm um das du direkt INSERTS mit prepared Statemens ausführt so das du kein Table-Komponente benötigst.
|
Re: Arbeitsspeicherproblem beim speichern in TurboDB-Datenba
du meinst SQL?
Das Programm umzubauen dass es ohne Table-Komponenten läuft wäre ziemlich aufwändig. Aber danke für den Tipp. |
Re: Arbeitsspeicherproblem beim speichern in TurboDB-Datenba
Zitat:
Nimm einfach zusätzlich eine Query mit auf das Formular. Die SQL-Abfrage (Property SQL) sieht dann so aus:
SQL-Code:
Statt TdbTable1 verwendest du den Namen der Query.
SELECT * FROM Tabellennamen WHERE 0=1
Zusätzlich wird alle 1000 Datensätze die Query geschlossen und neu geöffnet. Dies verhindert den immer weiter zunehmenden Verbrauch an Arbeitsspeicher.
Delphi-Quellcode:
Ganz klar ist, dass die Verwendung von INSERT-Anweisungen wie in Beitrag #4 empfohlen,
for i:=0 to 9999999 do
begin if (i mod 1000) = 0 then begin query1.close; query1.open; end; query1.Append; //Fill dataset with data for a := 2 to (151) do begin //Insert dword data into table field query1.Fields[a-1].AsInteger := i; end; //Save dataset to archive-database query1.Post; end; die performanteste und Speicherplatzschonenste Möglichkeit ist, aber mit obigem Sourcecode klappt es auch ganz gut. |
Re: Arbeitsspeicherproblem beim speichern in TurboDB-Datenba
VIELEN DANK für das Beispiel @ sx2008
Ich hatte früher auch SQL im Einsatz, musste aber leider auf Table-Komponenten der Performance wegen umsteigen. Bei SQL dauerte das Speichern eines Datensatzes ca. 30ms, mit der Table nur <10ms. Das ist schon ein großer Unterschied. |
Re: Arbeitsspeicherproblem beim speichern in TurboDB-Datenba
Zitat:
|
Re: Arbeitsspeicherproblem beim speichern in TurboDB-Datenba
Hallo,
was sagt denn memcheck oder fastmm4 -> war gerade vor 2-3 Tagen dran. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz