Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Arbeitsspeicherproblem beim speichern in TurboDB-Datenbank (https://www.delphipraxis.net/134253-arbeitsspeicherproblem-beim-speichern-turbodb-datenbank.html)

Tempdir 18. Mai 2009 15:58

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:
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;
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.

Besten Dank schonmal!

Bernhard Geyer 18. Mai 2009 16:07

Re: Arbeitsspeicherproblem beim speichern in TurboDB-Datenba
 
Was passiert wenn du zwischenzeitlich die DB-Verbindung schließt?

Tempdir 18. Mai 2009 16:10

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...

Bernhard Geyer 18. Mai 2009 16:18

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.

Tempdir 18. Mai 2009 16:22

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.

sx2008 18. Mai 2009 16:44

Re: Arbeitsspeicherproblem beim speichern in TurboDB-Datenba
 
Zitat:

Zitat von Tempdir
Das Programm umzubauen dass es ohne Table-Komponenten läuft wäre ziemlich aufwändig

So wild ist das nicht.
Nimm einfach zusätzlich eine Query mit auf das Formular.
Die SQL-Abfrage (Property SQL) sieht dann so aus:
SQL-Code:
SELECT * FROM Tabellennamen WHERE 0=1
Statt TdbTable1 verwendest du den Namen der Query.
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:
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;
Ganz klar ist, dass die Verwendung von INSERT-Anweisungen wie in Beitrag #4 empfohlen,
die performanteste und Speicherplatzschonenste Möglichkeit ist,
aber mit obigem Sourcecode klappt es auch ganz gut.

Tempdir 18. Mai 2009 16:50

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.

Bernhard Geyer 18. Mai 2009 16:53

Re: Arbeitsspeicherproblem beim speichern in TurboDB-Datenba
 
Zitat:

Zitat von Tempdir
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.

Verbesserungen erreichst du durch prepared Statements.

hoika 20. Mai 2009 18:14

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 14:18 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