Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TDataSet Performanceprobleme (https://www.delphipraxis.net/53432-tdataset-performanceprobleme.html)

smudo 16. Sep 2005 14:26


TDataSet Performanceprobleme
 
Hallo :hi: ,

ich nutze ein TDataSet um Daten im Speicher zu verwalten.
Bei größeren Datenmengen kommt es aber zu Performanceproblemen.
Ein besonderer Engpass ist das Auslesen eines Feldes:

Delphi-Quellcode:
FCells.Locate('id',ARow,[]);
Result:=FCells.FieldByName(IntToHeader(ACol)).asString;
Der erste Schritt (Locate) dauert teilweise mehr als 16 ms.
Ich hab's auch schon mit LookUp oder First und MoveBy versucht,
das Zeitverhalten ändert sich aber nicht.

Wie könnte ich den Vorgang optimieren?


Danke im Voraus

René

Union 16. Sep 2005 14:42

Re: TDataSet Performanceprobleme
 
Zitat:

Zitat von smudo
Hallo :hi: ,

ich nutze ein TDataSet um Daten im Speicher zu verwalten.
Bei größeren Datenmengen kommt es aber zu Performanceproblemen.
Ein besonderer Engpass ist das Auslesen eines Feldes:

Delphi-Quellcode:
FCells.Locate('id',ARow,[]);
Result:=FCells.FieldByName(IntToHeader(ACol)).asString;
Der erste Schritt (Locate) dauert teilweise mehr als 16 ms.
Ich hab's auch schon mit LookUp oder First und MoveBy versucht,
das Zeitverhalten ändert sich aber nicht.

Wie könnte ich den Vorgang optimieren?

Danke im Voraus

René

Worauf basiert denn Dein DataSet? Als erste Möglichkeit wäre hier die Erstellung eines Index zu nennen. Wenn Du dann einen hast, stelle Locate auf Findkey um, das ist mindestens 10x schneller. Desweiteren solltest Du die Häufig verwendeten Felder als Objekte definieren und nicht mit FieldByname jedesmal danach suchen lassen.

smudo 16. Sep 2005 15:07

Re: TDataSet Performanceprobleme
 
Danke, das klingt schon mal vielversprechend.

Zitat:

Zitat von Union
Worauf basiert denn Dein DataSet?

TCells ist eine von TDataSet abgeleitete Klasse ohne DB-Anbindung, zum tabellenartigen Lesen und Schreiben von Daten.

Zitat:

Zitat von Union
Als erste Möglichkeit wäre hier die Erstellung eines Index zu nennen.

Die erste Spalte trägt den Namen ID und beinhaltet die Zeilennummer, ist quasi mein Index.
Aber du meintest das sicherlich anders. kannst du mir bitte auf die Sprünge helfen?
FindKey klingt sehr gut, muss ich mir gleich mal ansehen.

Zitat:

Zitat von Union
Desweiteren solltest Du die Häufig verwendeten Felder als Objekte definieren...

Das geht nicht, da TCells eine allgemeine Struktur ist und beliebig groß sein kann. Es gibt also nur Spaltennummern als Header, keine festen Spalten.

Vielen Dank schonmal

René

Union 16. Sep 2005 15:26

Re: TDataSet Performanceprobleme
 
Ich wusste nicht, dass es sich nicht um eine DB-Anbindung handelt. Dann könntest Du einen Index nur ziemlich umständlich hinbekommen. Aber irgendwie musst Du doch TCells.Locate implementiert haben, vielleicht gibt es da Optimierungsmöglichkeiten?

smudo 16. Sep 2005 15:49

Re: TDataSet Performanceprobleme
 
:cry: TDataSet kennt leider kein FindKey, aber TCustomClientDataSet, werd ich mir mal ansehen.

Zitat:

Zitat von Union
Dann könntest Du einen Index nur ziemlich umständlich hinbekommen.

Wie umständlich wäre das denn?

Zitat:

Zitat von Union
Aber irgendwie musst Du doch TCells.Locate implementiert haben.

Nö. Hab ich nicht. Ist eine Methode von TDataSet.

Trotzdem Dankeschön, werd mal weitergucken.
Und wenn jemandem noch was hilfreiches einfällt, wäre ich sehr dankbar.

René

shmia 16. Sep 2005 17:24

Re: TDataSet Performanceprobleme
 
Zitat:

Zitat von smudo
ich nutze ein TDataSet um Daten im Speicher zu verwalten.
Der erste Schritt (Locate) dauert teilweise mehr als 16 ms.

Also ein Memory-Dataset.
Wie genau heist die Klasse und wo (URL ?) kann man den Sourcecode downloaden ?

alzaimar 16. Sep 2005 18:47

Re: TDataSet Performanceprobleme
 
Hi smudo,
Versuche doch, das mit ADO zu machen. Als 'Connection' nimmst Du einfach irgeneinen Textprovider. Dann setzt Du locktype auf ltBatchOptimistic. Dann werden die Daten nach einem Post nicht gespeichert, sondern erst nach ApplyUpdates. Ergo solltest Du eine Art TMemoryDataset haben.

Mit den ADO-Komponenten kannst Du aber Indexe erstellen, oder zumindest nach einer Spalte sortieren: Damit ist dann das Locate schneller.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 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 by Thomas Breitkreuz