AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi ListView Performance bei vielen Datensätzen (FMX)
Thema durchsuchen
Ansicht
Themen-Optionen

ListView Performance bei vielen Datensätzen (FMX)

Ein Thema von fisipjm · begonnen am 15. Jul 2024 · letzter Beitrag vom 22. Jul 2024
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#1

ListView Performance bei vielen Datensätzen (FMX)

  Alt 15. Jul 2024, 17:35
Hi,

ich bin auf der Suche nach Ideen für eine "bessere" Lösung. Aktuell habe ich eine ListView, die liegt auf einer Form die erst beim öffnen erstellt wird. Also nicht nur Visible True gesetzt wird, sondern wirklich über ein Create erstellt wird und danach wieder mit caFree entfernt wird. Das sollte auch so bleiben, da diese Logik sich durch das gesamte Projekt zieht. Das als Info vorneweg

Also ich lade aktuell in diese Listview beim on Show der Form die Daten Asyncron in die ListView (Ja, das geht weil ich Sie vorher auf visible=false setzte und ein Ladekreis drüber lege). Die Listview hat 4 Felder und erhält ca. 138.000 Einträge. Das geht in ca. 3 Sekunden.

Es gibt nun 2 Sachen die mich "stören".
1.) Die 3 Sekunden wenn ihr also eine Idee habt wie man noch schneller Daten in eine ListView laden kann und darstellen kann, immer her damit
2.) Das Listview.visible := true setze ich am Schluss meines Ladethreads innerhalb eines TThread.Synchronize weil das dann die Änderung an der Form sichtbar macht. Dieser Vorgang dauert auch nochmal ca. 2 sekunden. Also bis die Listview gezeichnet ist.

Habt ihre eine Idee, wie man da noch was rauskitzeln kann? Ich bin im FMX Umfeld unterwegs.
vG
PJM
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: ListView Performance bei vielen Datensätzen (FMX)

  Alt 15. Jul 2024, 17:58
Zitat:
visible=false ... asyncrhon
NEIN,
aber das Items hat ja auch noch ein BeginUpdate und EndUpdate.

Wie auch bei der VCL, würde ich hier noch mehr davon ausgehn, dass es grundsätzlich nicht threadsafe ist, aber ordentlich getrennt, sollte es dennoch halbwegs sicher sein.



Warum will man überhaupt so viel da reinladen?
Dynamisch nachladen oder via einem Filter nur so viel, wie der Mensch verkraftet.
$2B or not $2B
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#3

AW: ListView Performance bei vielen Datensätzen (FMX)

  Alt 16. Jul 2024, 07:53
Zitat:
visible=false ... asyncrhon
NEIN,
aber das Items hat ja auch noch ein BeginUpdate und EndUpdate.

Wie auch bei der VCL, würde ich hier noch mehr davon ausgehn, dass es grundsätzlich nicht threadsafe ist, aber ordentlich getrennt, sollte es dennoch halbwegs sicher sein.
Ja hast du natürlich recht, ich bin ebenfalls im BeginUpdate und im Endupdate drin. Mein "Problem" ist, wenn ich nur das BeginUpdate und EndUpdate verwende und nicht visible=False. ist die ListView an der Stelle schon mal nicht mehr ThreadSafe und ich muss das Erzeugen der Objekte im Mainthread machen, was wiederum dazu führt, das meine Ladeanimation hängt.

Zitat:
Warum will man überhaupt so viel da reinladen?
Dynamisch nachladen oder via einem Filter nur so viel, wie der Mensch verkraftet.
Das ist eine Auswahllist für Objekte aus denen der Benutzer auswählen können soll. Es gibt auch Favoriten, die dann über das SQL gesteuert an oberster Stelle stehen. Die Such/Filterfunktion der Listview gefällt mir sehr gut und ist auch bei dieser Datenmenge ausreichend performant und ich wollte mir den "Aufwand" sparen den Filter über das SQL zu implementieren. Außerdem sieht es "schicker" aus, wenn sich die Seite öffnet und bereits Datengeladen sind, anstatt erst nach was suchen zu müssen und dann überhaupt erst zu sehen, was für Werte zur Auswahl stehen.
  Mit Zitat antworten Zitat
Papaschlumpf73

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

AW: ListView Performance bei vielen Datensätzen (FMX)

  Alt 16. Jul 2024, 08:40
Die Such/Filterfunktion der Listview gefällt mir sehr gut und ist auch bei dieser Datenmenge ausreichend performant und ich wollte mir den "Aufwand" sparen den Filter über das SQL zu implementieren.
Mein ListView hat keine Filterfunktion oder habe ich da etwas übersehen? Ups, hab ich übersehen, ist ja für FMX - da gibts vielleicht eine Filterfunktion.

Der Vorschlag von himitsu, die ListItems dynamisch zu laden, ist m.E. aber der einzige Weg, das wirklich schnell zu machen. Dann müsste man natürlich die Such- und Filterfunktionen neu basteln. Das sieht dann auch so aus, als wären alle Einträge im ListView enthalten; tatsächlich kennt das ListView aber nur die ListItems, die gerade sichtbar sind.

Geändert von Papaschlumpf73 (16. Jul 2024 um 09:24 Uhr)
  Mit Zitat antworten Zitat
Papaschlumpf73

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

AW: ListView Performance bei vielen Datensätzen (FMX)

  Alt 16. Jul 2024, 09:37
Zusätzlich kann man ggf. auch noch die Ermittlung der Datensätze aus der SQL-Datenbank optimieren.
  • Optimierung der SQL-Abfrage selbst, damit der DB-Server das Ergebnis schneller ausliefert
  • Wenn man die SQL-Ergebnisse in irgendeinem DataSet mit "while not eof - next" durchläuft, kann "AutoCalcFields:=false" des DataSets enorme Performance bringen, selbst wenn es gar keine berechneten Felder gibt.
  • Noch viel schneller lassen sich so große Datenmengen z.B. per ADO mit TADOQuery1.Recordset.GetRows(...) direkt in ein großes Array laden, ohne Schleife und Next usw.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#6

AW: ListView Performance bei vielen Datensätzen (FMX)

  Alt 16. Jul 2024, 10:17
Wenn die Datensätze aus einer SQL Datenbank kommen, dann kann man sie auch "per page" laden.
In dem man immer die nächsten 50 oder die vorherigen 50 fetched und das Fetch offset entsprechend mit verschiebt.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#7

AW: ListView Performance bei vielen Datensätzen (FMX)

  Alt 16. Jul 2024, 10:30
Wenn die Datensätze aus einer SQL Datenbank kommen, dann kann man sie auch "per page" laden.
In dem man immer die nächsten 50 oder die vorherigen 50 fetched und das Fetch offset entsprechend mit verschiebt.
Ja, aber da greift wieder der Punkt mit dem Filter. Ich hatte gehofft es umgehen zu können eine eigene Filterfunktion zu schreiben.
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#8

AW: ListView Performance bei vielen Datensätzen (FMX)

  Alt 16. Jul 2024, 10:40
Zusätzlich kann man ggf. auch noch die Ermittlung der Datensätze aus der SQL-Datenbank optimieren.
  • Optimierung der SQL-Abfrage selbst, damit der DB-Server das Ergebnis schneller ausliefert
  • Wenn man die SQL-Ergebnisse in irgendeinem DataSet mit "while not eof - next" durchläuft, kann "AutoCalcFields:=false" des DataSets enorme Performance bringen, selbst wenn es gar keine berechneten Felder gibt.
  • Noch viel schneller lassen sich so große Datenmengen z.B. per ADO mit TADOQuery1.Recordset.GetRows(...) direkt in ein großes Array laden, ohne Schleife und Next usw.
Da ist, befürchte ich, nicht mehr viel Luft nach oben. Es sind nur die Felder die selektiert werden auch in der SQL Abfrage, ohne Sortierung.
Außerdem liegt der Dataset bereits geöffnet auf meinem TDataModule. Habe also keinen Overhead für das Öffnen des Datasets. Die CalcFields sind aus, haben aber auch keinen Impact auf die Ladezeit (getestet).
Ich gehe in einer EOF schleife durch. Könnte mal versuchen mit einer for schleife die RecNo zu setzen, vielleicht fallen dadurch noch ein paar Prüfungen die im Next durchgeführt werden weg.
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.623 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: ListView Performance bei vielen Datensätzen (FMX)

  Alt 16. Jul 2024, 11:51
Jetzt bin ich verwirrt. Liegt das Performance-Problem beim Einfügen der Daten in den ListView oder beim Auslesen der Daten aus der Datenbank?

(Ja, ich weiß, ich habe mich bisher nicht sinnvoll beteiligt, nur mitgelesen.)
Thomas Mueller

Geändert von dummzeuch (16. Jul 2024 um 13:32 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.960 Beiträge
 
Delphi 12 Athens
 
#10

AW: ListView Performance bei vielen Datensätzen (FMX)

  Alt 16. Jul 2024, 13:07
Ja, das wäre eine Untersuchung wert: wo ist das Bottleneck?
Laden aus der DB oder Einfügen in das Listview?
Ich gehe auch davon aus, dass die where Begingung des Selects
einen passenden Index in der DB nutzen kann?
Grüße
TurboMagic
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 23:24 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