Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Speicherauslastung einzelner Komponenten (https://www.delphipraxis.net/148890-speicherauslastung-einzelner-komponenten.html)

erich.wanker 10. Mär 2010 12:50


Speicherauslastung einzelner Komponenten
 
Hallo Leute,

Delphi7
Zeos-LIB
Firebird 2.1
Reportbuilder
LMD-Tools

Allgemein:
...hab ein "Speicherproblem" (Out of memory) wenn ich meinen "Import/Export" durchführe...


Situation:
Mit 30 Query´s greife ich auf eine GDB zu..
Eine Query1 ist die "Hauptquery" und besitzt z.B.: 1000 Datensätze (wird bis zum EOF durchgearbeitet)
die restlichen Querys werden anhand Query1.afterScroll gefiltert...

Mit 30 weiteren Querys greif ich auf eine Kopie einer leeren GDB (gleiche Tables wie das Original) zu und schreib genau das, was die 30 anderen an Daten liefern..


Problem:
... man kann im Taskmanager zuschauen , wie die Speicherauslastung meiner Software kontinuierlich in die höhe geht ..
Wenn man wenig Exportier, gibt es keine Probleme...
Wenn man viel Exportier, kann sich das Programm aufhängen (kommt auf die Hardware an)...


Meine Frage:
Jetzt würd ich gern (betreffend Fehlersuche) feststellen, was für diesen kontinuierlichen Speicherzuwachs verantwortlich ist ...
hat jemand Ideen ??

Vielen Dank

Erich Wanker

shmia 11. Mär 2010 17:36

Re: Speicherauslastung einzelner Komponenten
 
Zitat:

Zitat von erich.wanker
Mit 30 Query´s greife ich auf eine GDB zu..
Mit 30 weiteren Querys ...

Zwei Queries würden doch auch reichen.
Wenn du 30 Tabellen zu kopieren hast, dann kannst du doch jede Tabelle der Reihe nach kopieren.
Delphi-Quellcode:
// Quelltabelle öffnen
QuerySource.SQL.Text := 'SELECT * FROM '+tabellenname;
QuerySource.Open;
// Zieltabelle öffnen
QueryDest.SQL.Text := 'SELECT * FROM '+tabellenname + ' WHERE 0=1';
QueryDest.Open;
// Alle Datensätze kopieren
CopyDataSet(QuerySource, QueryDest);
Zum Kopieren aller Datensätze dient folgender Code:
Delphi-Quellcode:
procedure CopyDataSetRecord(Src,Dst: TDataSet; TagMask:Integer=0);
var
   i: Integer;
   fSrc,fDst: TField;
begin
   for i := 0 to Src.FieldCount-1 do
   begin
      fSrc := Src.Fields[i];
      fDst := Dst.FindField(fSrc.FieldName);

      // mit TagMask kann gezielt das Kopieren best. Felder verhindert werden
      // z.B. Autoinc-Felder
      if Assigned(fDst) and ((fSrc.Tag and TagMask)=0) then
      begin
         fDst.Value := fSrc.Value;
      end;
   end;
end;

procedure CopyDataSet(Src,Dst: TDataSet);
begin
   Src.First;
   while not Src.Eof do
   begin
      Dst.Append;
      try
         CopyDataSetRecord(Src,Dst);
         Dst.Post;
      except
         Dst.Cancel;
         raise;
      end;
      Src.Next;
   end;
end;
Damit hast du jetzt das Handwerkszeug zum Kopieren einzelner Tabelle.
Wichtig ist auch noch die Reihenfolge in der die Tabellen kopiert werden.
Zuerst die "Haupttabelle" kopieren und danach die abhängigen Tabellen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:08 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