Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Vergleich Clientdatasets (https://www.delphipraxis.net/211659-vergleich-clientdatasets.html)

ventiseis 19. Okt 2022 13:04

Datenbank: TClientdataset • Version: 10.2 • Zugriff über: DBX

Vergleich Clientdatasets
 
Hallo!

ich haben hier regelmäßig Probleme mit dem normalen TClientDataSet und bekomme die Fehlermeldung:
Code:
Insufficient memory for this operation

Funktion: Dbclient.TCustomClientDataSet.InternalCheck (Zeile 0)
Adresse: [5112E08F]

Aufruf-Stack:
  [5112E08A] Datasnap.Dbclient.TCustomClientDataSet.InternalCheck
  [5113374A] Datasnap.Dbclient.TCustomClientDataSet.InternalPost
  [511D4A5C] Data.Db.TDataSet.Post
Daraufhin habe ich das Dataset durch zwei unterschiedliche Komponenten testweise ersetzt:
  • TFDMemTable (Firedac)
  • kbmMemTable (Dritthersteller)
Bei einer Stichprobe funktionieren beide Komponenten ohne Exception und beinhalten nach dem Auffüllen der Daten den gleichen Inhalt.
Geschwindigkeit der Ausführung und Speicherverbrauch sind ähnlich.

Wir nutzen (an dieser Stelle) das Dataset unabhängig von der Datenbank: erst erstellen wir Felddefinition mit (gängigen) Datentypen (Zahlen, Strings, große Memo-Felder)
und füllen dann die Werte im Programm. Sonst ist bei uns noch überall DbExpress im Einsatz (z.B. auch zur Datenbankverbindung), hier in diesem Fall würde aber (ohne große Umbauten) auch
scheinbar das Firedac Dataset funktionieren.

Hat hier jemand Erfahrungswerte oder einen Tipp, welche dieser Komponenten für diesen Zweck sinnvoller wäre? Oder lässt sich die Fehlermeldung im bestehenden Dataset
irgendwie vermeiden (ohne natürlich Felder wegzulassen)?

Sinspin 19. Okt 2022 14:25

AW: Vergleich Clientdatasets
 
Hallo,

was ist denn die Fehlermeldung die da kommt?

Ich/wir verwenden seit Jahren erfolgreich KbmMemTable. Selbst bei Tabellen mit tausenden Datensätzen gibt es keine Probleme.
Die FD Version muss ich mir noch im Detail ansehen.
Bei KbmMemTable finde ich als absolutes Plus das man wunderschön die Daten einer Tabelle mit zig anderen Tabellen teilen kann ohne umständliche Konstrukte bauen zu müssen.

ventiseis 19. Okt 2022 14:43

AW: Vergleich Clientdatasets
 
Die Fehlermeldung bekomme ich nur beim mitgelieferten TClientDataset von Delphi.

Die zwei anderen Datasets funktionieren ohne Probleme. Ich werde mal noch ein Beispielprogramm machen, welches einen einfacheren Vergleich (Geschwindigkeit, Speicherverbrauch) erlaubt.

Sinspin 19. Okt 2022 16:16

AW: Vergleich Clientdatasets
 
Zitat:

Zitat von ventiseis (Beitrag 1513479)
Die Fehlermeldung bekomme ich nur beim mitgelieferten TClientDataset von Delphi.

Diese Antwort bringt NULL Informationszuwachs.:?

Wie lautet die Fehlermeldung? Welchen Text hat sie?
Das Stück der Meldung in deinem ersten Post ist ziemlich nutzlos ohne den Text der wirklichen Fehlermeldung. Das sind ja nur Zusatzinfos.

ventiseis 19. Okt 2022 20:10

AW: Vergleich Clientdatasets
 
Entschuldigung, manchmal ist man wirklich betriebsblind :wall:.
Die Fehlermeldung der Exception ist natürlich:
Insufficient memory for this operation
Ich habe mittlerweile ein Vergleichsprogramm geschrieben mit folgender Idee:
  • Aufbau eines Beispiel-Datasets mit hinreichend vielen Felddefinitionen
  • so viele Datensätze hineinschreiben, bis der Speicherplatz knapp wird

Man kommt hier mit der mit der TFdMemtable viel wieder als mit dem alten TClientDataset: es können viel mehr Datensätze angelegt werden, bis ca. 1.9GB Hauptspeicher verbraucht sind. Beim TClientDataset kommt der Speicherfehler schon bei knapp 1 GB Daten.

Zusätzlich habe ich noch TVirtualTable von DevArt ausprobiert, das funktioniert ebenfalls gut, es passen aber weniger Datensätze in ein Dataset. Aus irgendeinem Grund funktioniert kbmMemTable in meinem Beispiel wieder nicht. Das mag daran liegen, dass die herunterladbare Freeware-Version schon einige Jahre alt ist und es keine Trial-Version für ein aktuelle Delphi gibt. Erst nach einigem Basteln konnte ich die Units zum kompilieren bringen, habe mich hier aber vermutlich irgendwo verzettelt.

mytbo 19. Okt 2022 21:46

AW: Vergleich Clientdatasets
 
Zitat:

Zitat von ventiseis (Beitrag 1513496)
Man kommt hier mit der mit der TFdMemtable viel wieder als mit dem alten TClientDataset: es können viel mehr Datensätze angelegt werden, bis ca. 1.9GB Hauptspeicher verbraucht sind. Beim TClientDataset kommt der Speicherfehler schon bei knapp 1 GB Daten.

Bei großen Datenmengen würde ich eher SQLite statisch ins Programm einbinden. Wenn es sein muss, kann man SQLite auch als In-Memory-Datenbank verwenden. Wie es mit mORMot gemacht wird, kannst du hier nachlesen. Werte zur Performance findest du hier.

Bis bald...
Thomas

himitsu 19. Okt 2022 22:18

AW: Vergleich Clientdatasets
 
Zitat:

schon bei knapp 1 GB
32 Bit oder 64 Bit
wenn 32 Bit, sind da die 4GB aktiviert

UND

wie ist die Tabelle aufgebaut?
FieldTypen und vor allem deren Größe

wenn man 100 StringFields á 64KB pro Field hat
und dann je nur 2 Chars rein tut, dann ist man selbst Schuld

ventiseis 20. Okt 2022 06:56

AW: Vergleich Clientdatasets
 
Zitat:

Zitat von mytbo (Beitrag 1513500)
Bei großen Datenmengen würde ich eher SQLite statisch ins Programm einbinden. Wenn es sein muss, kann man SQLite auch als In-Memory-Datenbank verwenden.
Thomas

Die Idee finde ich gut!

Allerdings gibt es neben technischen Gründen, so etwas einzubauen, auch immer noch die organisatorischen Rahmenbedingungen: wer kennt sich damit aus, wenn mal nicht funktioniert? Wie viele Abhängigkeiten möchte kann man in sein Projekt aufnehmen? Mir erscheint es hier immer noch weniger aufwändig, lediglich das Dataset auszutauschen.

ventiseis 20. Okt 2022 07:17

AW: Vergleich Clientdatasets
 
Zitat:

Zitat von himitsu (Beitrag 1513502)
32 Bit oder 64 Bit

Nur 32bit, ohne das 4GB-Flag.
Es ist natürlich, wie es immer ist: man mag möglichst wenig ändern, um nicht andere Probleme zu erzeugen.
Zitat:

Zitat von himitsu (Beitrag 1513502)
wenn man 100 StringFields á 64KB pro Field hat und dann je nur 2 Chars rein tut, dann ist man selbst Schuld

Naja, die Datenauswahl treffe ja nicht ich - die Daten sind in der Kundendatenbank. Es ist ja sogar so, dass die meisten der Daten im Dataset nicht einmal ausgegeben werden. Es wird
erst nach der Aufbereitung der Daten entschieden, welche Felder verwendet werden. Klar, hier ist eine Optimierungsmöglichkeit!

Es ging mir mit meinem Posting aber nicht darum, allgemeine Verbesserungsvorschläge zu bekommen, sondern eher darum, warum man mit ähnlicher Technologie (Clientdataset) und unterschiedlichen
Komponenten so unterschiedliche Ergebnisse erziehlt. Mir kommt es so vor, als würde das TClientdataset auch für leere String-Felder immer den ganzen Speicherplatz benötigen, obwohl oft nix drinsteht.
Die anderen Datasets scheinen hier sparsamer mit dem Ressourcen umzugehen: man bekommt mit den identischen Daten viel mehr Datansätze in die Clientdatanmenge.

PS: Tabellenaufbau beim Beispiel:

BOOLEAN: 4 Feld(er)
DATE: 6 Feld(er)
FMTBCD(5,2): 1 Feld(er)
INTEGER: 10 Feld(er)
MEMO: 1 Feld(er)
STRING(1): 1 Feld(er)
STRING(10): 14 Feld(er)
STRING(100): 8 Feld(er)
STRING(12): 1 Feld(er)
STRING(20): 2 Feld(er)
STRING(26): 1 Feld(er)
STRING(30): 2 Feld(er)
STRING(34): 1 Feld(er)
STRING(35): 2 Feld(er)
STRING(50): 4 Feld(er)
STRING(5000): 3 Feld(er)
TIMESTAMP: 3 Feld(er)

Papaschlumpf73 20. Okt 2022 08:00

AW: Vergleich Clientdatasets
 
Hast du mal versucht beim TClientDataSet direkt nach CreateDataSet die Eigenschaft LogChanges:=false; zu setzen? Möglicherweise verbraucht die Änderungsprotokollierung auch einen Haufen Speicher.


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

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