Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Große Datenmengen richtig verarbeiten bzw. Out of Memory (https://www.delphipraxis.net/197012-grosse-datenmengen-richtig-verarbeiten-bzw-out-memory.html)

freejay 11. Jul 2018 10:19

AW: Große Datenmengen richtig verarbeiten bzw. Out of Memory
 
Davon gehe ich aus.

Bernhard Geyer 11. Jul 2018 10:40

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

Zitat von freejay (Beitrag 1406919)
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.

freejay 11. Jul 2018 10:43

AW: Große Datenmengen richtig verarbeiten bzw. Out of Memory
 
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?

Jasocul 11. Jul 2018 10:52

AW: Große Datenmengen richtig verarbeiten bzw. Out of Memory
 
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
Delphi-Quellcode:
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.

hoika 11. Jul 2018 10:55

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

Query.First machen wegen Problemen.
Gut zu wissen!
Welche DB und welche Version von FireDAC hattest Du denn damals?

Schokohase 11. Jul 2018 11:04

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

Zitat von hoika (Beitrag 1406923)
Welche DB und welche Version von FireDAC hattest Du denn damals?

Eigentlich sprechen wir hier über ZEOS

Jasocul 11. Jul 2018 11:58

AW: Große Datenmengen richtig verarbeiten bzw. Out of Memory
 
@hoika:
Das Phänomen hatte ich mit verschiedenen DBs und Zugriffskomponenten.
Die genutzten Query-Komponenten waren aber Ableitungen von TDataSet.
btw: Das ist kein BDE-Problem. Das nutze ich schon gefühlte Jahrhunderte nicht mehr.

Es mag durchaus sein, dass das mit Zeos und Embedded-Datenbanken nicht passiert, aber das kann ich bei mir nicht prüfen.

Übrigens hatte ich auch mal Probleme mit
Delphi-Quellcode:
IsEmpty
. Im TDataSet gibt es dafür wohl ein Vergleich auf Recordcount, was durchaus mal fehlschlagen kann, da das auch 0 sein kann, wenn Datensätze gefunden wurden. Meines Wissens hängt das von der DB und der Property FetchAll ab. Daher prüfe ich nur noch, ob eof und bof gleichzeitig true sind.

p80286 11. Jul 2018 20:31

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

Zitat von Jasocul (Beitrag 1406922)
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

Jasocul 12. Jul 2018 06:19

AW: Große Datenmengen richtig verarbeiten bzw. Out of Memory
 
Ich denke, das ist wie mit dem Vergleich einer Boolean Variablen auf True/False. Normalerweise läuft trotzdem alles korrekt.

Mir ist es einfach vor Jahren mal passiert und seitdem gehe ich den sicheren Weg.

Delphi.Narium 12. Jul 2018 16:24

AW: Große Datenmengen richtig verarbeiten bzw. Out of Memory
 
Mir ist es auch ganz selten mal passiert, das BoF, EoF "falsche" Werte lieferten.

Das liegt wohl weniger an den Komponenten, sondern an dem, was die Datenbank (oder irgendwas aus den Zwischenschichten, Clients, Treibern, wieauchimmer ...) da so an Infos "rausrückt".

Identische Komponenten, aber unterschiedliche Datenbanken können, wenn auch seeeeeehr selten, zu solchen Problemen führen.

Ja nach Datenbank kann es auch passieren, dass RecordCount identisch mit RecNo ist, solange man nur vorwärts scrollt (per Next). Beim Rückwärtsscrollen bleibt RecordCount auf der RecNo des höchsten, bisher erreichten, Datensatze. Scrollt man über den hinaus, steigt RecordCount solange auf RecNo, bis man einmal EoF erreicht hat.

So wie First zu einem korrekten EoF führen kann, kann Last zu einem korrekten RecordCount führen (wobei dann aber die gesamte Datenmenge geladen wird und das kann dauern).

Und wenn man (bei unverändertem Quelltext) den Datenbanktyp wechselt, kann es sein, dass das Problem weg ist.

Aber: Das ist mir in ca. 22 Jahren so 3 oder 4 Mal passiert. Es ist ein sehr selten auftretender Fehler.

Erlebt in Delphiversionen bis D7.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:10 Uhr.
Seite 2 von 3     12 3      

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