![]() |
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:
Daraufhin habe ich das Dataset durch zwei unterschiedliche Komponenten testweise ersetzt:
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
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)? |
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. |
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. |
AW: Vergleich Clientdatasets
Zitat:
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. |
AW: Vergleich Clientdatasets
Entschuldigung, manchmal ist man wirklich betriebsblind :wall:.
Die Fehlermeldung der Exception ist natürlich: Insufficient memory for this operationIch habe mittlerweile ein Vergleichsprogramm geschrieben mit folgender Idee:
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. |
AW: Vergleich Clientdatasets
Zitat:
![]() ![]() Bis bald... Thomas |
AW: Vergleich Clientdatasets
Zitat:
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 |
AW: Vergleich Clientdatasets
Zitat:
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. |
AW: Vergleich Clientdatasets
Zitat:
Es ist natürlich, wie es immer ist: man mag möglichst wenig ändern, um nicht andere Probleme zu erzeugen. Zitat:
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:
|
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 20:28 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