AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Große Datenmengen richtig verarbeiten bzw. Out of Memory
Thema durchsuchen
Ansicht
Themen-Optionen

Große Datenmengen richtig verarbeiten bzw. Out of Memory

Ein Thema von Monday · begonnen am 10. Jul 2018 · letzter Beitrag vom 4. Aug 2018
Antwort Antwort
Seite 1 von 2  1 2      
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Große Datenmengen richtig verarbeiten bzw. Out of Memory

  Alt 10. Jul 2018, 08:11
Hallo,

Delphi-Quellcode:
for a := 0 to ZQuery1.RecordCount-1 do begin
  // *** Hier die einzelnen Datensätze verarbeiten ***
  end; //for
select id,*
Brauchst Du wirklich alle Felder der Tabelle?

Das könnte schon das Problem sein.
Hier werden ja nach DB alle Datensätze lokal heruntergeladen und zwischengespeichert.
Ändere das mal ab.

Delphi-Quellcode:
ZQuery1.UniDirectional:= True;
while not ZQuery1.Eof do
begin
  // Datensatz verarbeiten

  ZQuery1.Next;
end;
Heiko
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Große Datenmengen richtig verarbeiten bzw. Out of Memory

  Alt 10. Jul 2018, 08:23
Die Frage wäre auch, was die Verarbeitung macht?
z.B.
- Selektierte Daten ändern
- neue erzeugen / ggF. in andere Tabelle
- irgendwas zählen
?

Viele solcher Maßnahmen können durch SQL erledigt werden, ohne dass man überhaupt Daten aus der DB lokal holt.

Ist es nichts von dem oben, sondern -sagen wir mal- ein kleiner Datenabgleich und speichern eines Resultats in einer Datei, könnte man den Datenzugriff schlanker gestalten, Stichwort unidirektionale Cursor, Readonly, etc..
Ich weiß allerdings nicht, was die sqlite clients da können.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.828 Beiträge
 
Delphi 12 Athens
 
#3

AW: Große Datenmengen richtig verarbeiten bzw. Out of Memory

  Alt 10. Jul 2018, 09:55
Ich hoffe SQLite kann das und ZEROS sollte auch eine Fetch-Funktion bieten,
also wo das DataSet nicht alle Daten runterläd, sondern nur ein Fenster/Teil des ganzen ResultSets.

http://zeoslib.sourceforge.net/viewtopic.php?t=20005
http://forum.lazarus.freepascal.org/...?topic=13192.0

Wenn nicht, dann mußt du das eben selber implementieren, die Abfrage mehrmals mit LIMIT/OFFSET ausführen und die Daten stückchenweise holen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.018 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Große Datenmengen richtig verarbeiten bzw. Out of Memory

  Alt 11. Jul 2018, 08:09

Delphi-Quellcode:
ZQuery1.UniDirectional:= True;
while not ZQuery1.Eof do
begin
  // Datensatz verarbeiten

  ZQuery1.Next;
end;
Das Setzen von UniDirectional auf True muss vor dem Öffnen (ZQuery1.Open) der Abfrage erfolgen, danach ist es "zu spät", wenn ich mich nicht irre?
Michael Justin
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
276 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Große Datenmengen richtig verarbeiten bzw. Out of Memory

  Alt 11. Jul 2018, 10:19
Davon gehe ich aus.
[Delphi 11.3.1 Enterprise; Win10/11; MySQL; VCL]
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.239 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Große Datenmengen richtig verarbeiten bzw. Out of Memory

  Alt 11. Jul 2018, 10:40
Davon gehe ich aus.
Würde ich nicht.
Bei SQLite läuft die DB im eigenen Adressraum (Embedded).
Das was bei einer richtigen SQL-Datenbank mit eigenen Prozess gut/positiv ist, kann für eine Embedded-DB den gegenteiligen Effekt bewirken.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
276 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Große Datenmengen richtig verarbeiten bzw. Out of Memory

  Alt 11. Jul 2018, 10:43
Also ich hatte auf den vorherigen Post

Zitat:
Das Setzen von UniDirectional auf True muss vor dem Öffnen (ZQuery1.Open) der Abfrage erfolgen, danach ist es "zu spät", wenn ich mich nicht irre?
mit

Zitat:
Davon gehe ich aus.
geantwortet.

Bezieht sich darauf Deine Antwort?
[Delphi 11.3.1 Enterprise; Win10/11; MySQL; VCL]
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.378 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Große Datenmengen richtig verarbeiten bzw. Out of Memory

  Alt 11. Jul 2018, 10:52
Wenn wir schon bei solchen Dingen sind, dann noch von mir der Hinweis, dass vor dem
Delphi-Quellcode:
while not ZQuery1.Eof do
begin
   // Datensatz verarbeiten

   ZQuery1.Next;
end;
noch ein
ZQuery1.First; gemacht werden sollte.
Nach einem Open kann es in einigen Fällen dazu kommen, dass EOF true ist.
Bekannt sind mir folgende Fälle:
- kein FetchAll
- Nur ein Datensatz in der Ergebnismenge
Das passierte mir in den Fällen auch nur sehr selten, aber ich mache immer ein First, seitdem ich mal Probleme damit hatte.

Es ist gut möglich, dass das Problem in neueren Delphi-Versionen nicht mehr existiert. Das letzte mal hatte ich das Problem mit XE2.
Peter
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Große Datenmengen richtig verarbeiten bzw. Out of Memory

  Alt 11. Jul 2018, 10:55
Hallo,
Zitat:
Query.First machen wegen Problemen.
Gut zu wissen!
Welche DB und welche Version von FireDAC hattest Du denn damals?
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Große Datenmengen richtig verarbeiten bzw. Out of Memory

  Alt 11. Jul 2018, 20:31
Nach einem Open kann es in einigen Fällen dazu kommen, dass EOF true ist.
Bekannt sind mir folgende Fälle:
- kein FetchAll
- Nur ein Datensatz in der Ergebnismenge
Das passierte mir in den Fällen auch nur sehr selten, aber ich mache immer ein First, seitdem ich mal Probleme damit hatte.

Es ist gut möglich, dass das Problem in neueren Delphi-Versionen nicht mehr existiert. Das letzte mal hatte ich das Problem mit XE2.
Interessant. Ich habe unter D7 / 2006 nie ein .First gebraucht und .EOF war false es sei denn es kam eine leere Menge zurück, da hatte ich wohl Glück!
(oder könnte es sein, daß die Qualität der DB-Komponenten nicht so konsistent ist wie wir es gerne hätten)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz