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; CurrentItem.Connection := CurrentConnection; CurrentItem.SQL.Clear; CurrentItem.SQL.Add('SELECT COUNT(*) FROM SalesTable;'); CurrentItem.Open; CurrentItem.Close; 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
lblCurrentDBItemProcess.Caption := sRebuildProcessingItem + CurrentItem.FieldByName('ID').AsString; Application.ProcessMessages; CurrentItem.Next; end; end; CurrentItem.Close; finally 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.
NOS hat folgendes geschrieben : |
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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!