Entwickler-Ecke

Datenbanken - Zugriff auf alle Items einer DB - Zu wenig Speicher


NOS - Di 23.10.18 20:50
Titel: Zugriff auf alle Items einer DB - Zu wenig Speicher
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


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


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


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


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