Autor Beitrag
NOS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 2

Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
BeitragVerfasst: Di 23.10.18 20:50 
Hallo,

ich möchte mit einer Schleife alle Items einer DB nach und nach aufrufen und daraus eine Statistik erstellen. Die DB ist 66GB und hat knappe 200.000 Entries.

Ich bekomme immer den Fehler "Zu wenig Speicher" und dacht eigentlich dass FireDAC das intern managed aber es liegt wohl an den Settings dass es nicht funktioniert.

Anbei mal mein Code ... könnt Ihr mir einen Tipp geben woran es liegt?

Grüße ins Forum,
Andreas

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
 CurrentConnection := TFDConnection.Create(nil);
 CurrentItem := TFDQuery.Create(nil);
 try
  CurrentConnection.LoginPrompt := false;
  CurrentConnection.UpdateOptions.LockWait := false;
  CurrentConnection.ConnectionName := 'Database-ItemAccess';
  CurrentConnection.Params.DriverID := 'FB';
  CurrentConnection.Params.Database := edSelectedDBFileName.FileName;
  CurrentConnection.Params.Pooled := false;
  CurrentConnection.Params.UserName := sDBUserName;
  CurrentConnection.Params.Password := sDBPassword;
  CurrentConnection.Params.Add('OSAuthent=No');
  CurrentConnection.Params.Add('CharacterSet=utf8');
  CurrentConnection.Params.Add('Protocol=Local');
  CurrentConnection.Params.Add('DropDatabase=No');
  CurrentConnection.Params.Add('CreateDatabase=No');
  CurrentConnection.Params.Add('PageSize=16384');
  CurrentConnection.Connected := true;
  // create database dataset and connect to database
  CurrentItem.Connection := CurrentConnection;
  // url count
  CurrentItem.SQL.Clear;
  CurrentItem.SQL.Add('SELECT COUNT(*) FROM SalesTable;');
  CurrentItem.Open;
  // set max items count

  CurrentItem.Close;
  // items
  CurrentItem.SQL.Clear;
  CurrentItem.FetchOptions.Mode := fmOnDemand;
  CurrentItem.Open('SELECT * FROM SalesTable;');
  if not CurrentItem.IsEmpty then
  begin
   while not CurrentItem.Eof and (Cancelled = false) do
   begin


    // set progress stuff
    lblCurrentDBItemProcess.Caption := sRebuildProcessingItem + CurrentItem.FieldByName('ID').AsString;
    Application.ProcessMessages;
    // get next item
    CurrentItem.Next;
   end;
  end;
  // close item
  CurrentItem.Close;
 finally
  // disconnect the dataset from the db and free it
  CurrentItem.Connection := nil;
  CurrentItem.Free;
  CurrentConnection.Free;
 end;
icho2099
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 101
Erhaltene Danke: 12

WIN XP, WIN 7, WIN 10
Delphi 6 Prof, Delphi 2005, FPC
BeitragVerfasst: Mi 24.10.18 07:48 
Moin,

ich hole bei großen Datenmengen immer erst die Anzahl Sätze mit count(*) und
mache dann select ... Limit x,y bis alles gelesen wurde.

Für diesen Beitrag haben gedankt: NOS
NOS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 2

Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
BeitragVerfasst: Mi 24.10.18 09:33 
Hallo icho2009,

die Anzahl hole ich mir auch vorher ... ich dachte es gibt eine Art "Automatismus" dafür oder irgendwas in den Fetchoptions.
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mi 24.10.18 11:59 
Hallo,

ich verwende UniDac nicht FireDac, aber da gibt es etwas wie FetchAll = False und FetchRecords = 15 (oder was auch immer).
Das verwende ich für alle Tabellen die eine stetig wachsende Anzahl von Datensätzen haben. Es bleibt also beim Speicherberbrauch für die definierte Anzahl an Records. Wenn ich da tausende Datensätze durchziehe wird es natürlich langsam, Aber es geht.

Ich würde vorschlagen das Du versuchst die Auswertung auf der DB zu fahren. Entweder als Script in deiner Abfrage oder als Stored Procedure.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?

Für diesen Beitrag haben gedankt: NOS
NOS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 2

Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
BeitragVerfasst: Mi 24.10.18 13:13 
Hallo Sinspin,

mit Stored Procedures kenne ich mich so garnicht aus ... wäre es theoretisch möglich dass ich die quasi meine Statisticauswertung als Stored Procedure speichere und diese quasi die Daten der DB analysiert und diese gleichzeitig in eine Statistiktabelle in der DB schreibt?

Gibt es gute Tutorials zum Thema Stored Procedures und FireBird?

Grüße und lieben Dank,

Andreas
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mi 24.10.18 14:55 
Ganz grob, eine Stored Procedure ist eine in SQL geschriebene Procedure die vielfältige Änderungen auf der DB ausführen kann. Genauso kann sie selber eine nur lesbare Tabelle zurückliefern.
user profile iconNOS hat folgendes geschrieben Zum zitierten Posting springen:
Gibt es gute Tutorials zum Thema Stored Procedures und FireBird?
Wenn nicht für FB dann zumindest für den SQL Dialekt. Also, ich denke schon.
Kommt bisschen auf die Größe der Tabelle und den Umfang der Auswertung an aber generell könnte ich dir ein bisschen unter die Arme greifen. Habe noch nie mit FB gearbeitet. Aber man macht ja gerne immer mal was Neues.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?

Für diesen Beitrag haben gedankt: NOS
NOS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 2

Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
BeitragVerfasst: Mi 24.10.18 15:14 
Ok ... ich versuche mich mal mit dem Thema vertraut zu machen und schaue mal wie weit ich komme ... würde mich freuen Dich als potentiellen "Ansprechpartner" im Hintergrund zu wissen falls ich nicht weiter komme :-)

Zunächst einmal vielen lieben Dank und schöne Grüße,

Andreas