AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Vergleich Clientdatasets

Ein Thema von ventiseis · begonnen am 19. Okt 2022 · letzter Beitrag vom 20. Okt 2022
Antwort Antwort
Seite 1 von 2  1 2      
ventiseis

Registriert seit: 15. Jan 2009
Ort: 94032 Passau
53 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

Vergleich Clientdatasets

  Alt 19. Okt 2022, 13:04
Datenbank: TClientdataset • Version: 10.2 • Zugriff über: DBX
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)?
Bastian

Geändert von ventiseis (20. Okt 2022 um 07:21 Uhr) Grund: Text ergänzt
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
617 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Vergleich Clientdatasets

  Alt 19. Okt 2022, 14:25
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.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
ventiseis

Registriert seit: 15. Jan 2009
Ort: 94032 Passau
53 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: Vergleich Clientdatasets

  Alt 19. Okt 2022, 14:43
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.
Bastian
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
617 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Vergleich Clientdatasets

  Alt 19. Okt 2022, 16:16
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.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
ventiseis

Registriert seit: 15. Jan 2009
Ort: 94032 Passau
53 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: Vergleich Clientdatasets

  Alt 19. Okt 2022, 20:10
Entschuldigung, manchmal ist man wirklich betriebsblind .
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.
Bastian

Geändert von ventiseis (19. Okt 2022 um 20:11 Uhr) Grund: Buchstaben verdreht
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
461 Beiträge
 
#6

AW: Vergleich Clientdatasets

  Alt 19. Okt 2022, 21:46
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Vergleich Clientdatasets

  Alt 19. Okt 2022, 22:18
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
ventiseis

Registriert seit: 15. Jan 2009
Ort: 94032 Passau
53 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#8

AW: Vergleich Clientdatasets

  Alt 20. Okt 2022, 06:56
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.
Bastian
  Mit Zitat antworten Zitat
ventiseis

Registriert seit: 15. Jan 2009
Ort: 94032 Passau
53 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

AW: Vergleich Clientdatasets

  Alt 20. Okt 2022, 07:17
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.
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)
Bastian
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
314 Beiträge
 
Delphi 12 Athens
 
#10

AW: Vergleich Clientdatasets

  Alt 20. Okt 2022, 08:00
Hast du mal versucht beim TClientDataSet direkt nach CreateDataSet die Eigenschaft LogChanges:=false; zu setzen? Möglicherweise verbraucht die Änderungsprotokollierung auch einen Haufen Speicher.
  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 14:16 Uhr.
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