Verständnisfrage bezüglich QStandardItemModel

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo Leute,

bevor ich dazu übergehe und meine allgemeine Verständnisfrage formuliere, möchte ich eine Art Einleitung vorlegen, damit ihr ungefähr erahnen könnt, wie ich auf diese Frage komme.

In Bezug auf Datenstruktur (beispielsweise Liste) wird immer sowohl direkt als auch indirekt eine Warnung ausgesprochen, dass man solange mit der Liste arbeiten soll, wie man aus Sicht des Entwicklers die einzelnen Elemente in der Liste überschaubar verwalten kann. Wenn man jedoch keinen Einfluss auf die Datenmenge hat, sollte man einen anderen Weg suchen, weil die Liste in den Arbeitsspeicher geladen und gespeichert wird. Ähnlich verhält es sich mit dem Einlesen von Dateien. Auch hier sollte man sich überlegen, ob man anstatt readline() doch eher readlines() verwenden soll, damit nicht der gesamte Inhalt einer Datei in den Arbeitsspeicher gestopft wird.

In Anlehnung dessen habe ich mich dann gefragt, wohin QStandardItemModel mit all den Daten gespeichert wird? In meinem derzeitigen Projekt arbeite ich mit diesem QStandardItemModel()-Objekt. Die Datensätze aus der Datenbank werden in diesen Model geladen, und über QTreeView() ausgegeben. Hier hat der Entwickler wenig Einfluss auf das Verhalten der Benutzer. Ein Benutzer kann, rein hypothetisch, nahezu unendlich viele Datensätze in die Datenbank speichern. Und wenn all diese Datensätze nun in das Model geladen werden, wird nicht dadurch der Arbeitsspeicher ebenfalls vollgestopft? Um mal ein Kontrast herzustellen. Meine Annahme ist: wenn ich auf dem Model und auf die QTreeView() verzichten, und stattdessen QTreeWidget() nehmen würde, dann werden die Daten einzeln auf dieses QTreeWidget()-Objekt abgefügt, aber die gesamten Datensätze der Datenbank werden nicht im Arbeitsspeicher gehalten, nachdem die QTreeWidget() zu Ende gefüllt wurde.

Ich frage nur deshalb, weil man bei Datenstrukturen wie Listen stets den Hinweis mitgibt, dass bei zu vielen Datenmengen eine Liste weniger vorteilhaft sei. Und bei diesem Model schaut man weg? Ich hoffe, ihr versteht meine Frage.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

auch dieser Fall lässt sich mit dem Model lösen. http://doc.qt.io/qt-5/qtwidgets-itemvie ... ample.html
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@__deets__: Mir wird nicht ganz ersichtlich, inwieweit meine Überlegung dort gelöst wird.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Inkrementelles nachladen von Daten. Da steht wortwörtlich “When you have large - or perhaps even infinite - data sets, you will need to add items to the model in batches, and preferably only when the items are needed by the view (i.e., when they are visible in the view).”

Was ist daran missverständlich?
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@__deets__: Danke. Ich habe diese Stelle wohl zu schnell überflogen. Da ich diese C++-Beispiele kein Stück verstehe, muss ich nach einem Python-Beispiel suchen, wo einem gezeigt wird, wie man nachlädt.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich rate dir, das bisschen C++ für diesen Zweck zu begreifen. Das ist ja wirklich nicht viel, und Dinge wie const, override sowie subtile Unterschiede zwischen Pointern (*) und Referenzen (&) kannst du ignorieren.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@__deets__: Ich habe dieses C++-Beispiel in PyQt5-Beispiel gefunden. Soweit ganz gut. Allerdings verstehe ich nicht ganz, inwiefern die Daten in Stapeln nachgeladen werden? Wenn ich das Programm ausführe, wird mir angezeigt, dass in meinem Fall 85 Items geladen wurden. So viele Dateien befinden sich in meinem Ordner, der geladen wird. Das heißt, es wurden ganze 85 Items in einem Rutsch in das Model geladen. Aber allgemein verstehe ich es nicht ganz. Denn das Model muss ja zunächst mit kompletten Daten gefüllt werden, richtig? In meinem Fall wäre es ja unmöglich, dass das Model selbstständig die Daten aus meiner Datenbank nach lädt, da dieses Model ja die Datenbank-Abragen nicht kennt. Demzufolge lädt man erst einmal die gesamten Daten in das Model. Und genau DA setze ich gedanklich an. Wird das Model samt Daten in den Arbeitsspeicher gehalten?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sophus hat geschrieben:Denn das Model muss ja zunächst mit kompletten Daten gefüllt werden, richtig?
Nein. Muss es nicht. Die verlinkten Modelle bzw. Beispiele zeigen klar das nicht. Ein Modell ist eine Sicht auf potentiell unendlich viele (bzw üblicherweise eher dynamisch viele) Daten, die sich auch noch ändern können. Wenn es nur eine glorifizierte Liste wäre, wäre der ganze Aufriss ein bisschen viel.

Ich wiederhole mich zum 3ten mal: es gibt ein Model-basierte Lösung für dein Problem. Wenn du das nicht erkennen kannst, liegt das Problem in deiner Wahrnehmung & das durcharbeiten von Beispielen ändert die hoffentlich.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@__deets__: Dann wiederhole ich mich auch mal. Ich erkenne leider nicht, inwieweit Datensätze aus meiner Datenbank nachträglich per Abfrage nachgeladen werden sollten. Ich sehe in meiner Wahrnehmung (um mal überspitzt dich zu zitieren), dass ich auf der einen Seite die Datenbank habe, die durch SQLAlchemy angesprochen wird. Auf der andere Seite habe ich das Model. Auf der GUI-Seite klickt der Benutzer auf die Schaltfläche "Laden", und nun beginnt der SQLAlchemy-Apparat die Daten per Abfrage die Daten aus der Datenbank zu laden. Irgendwo müssen die Daten ja hin. Vielleicht auf ein Blatt Papier? Lieber doch nicht, wäre reine Verschwendung, wegen Regenwald und so. Also bringen wir sie in ein Model unter In dem genannten Bespielt sehe ich also all meine 85 Items auf meinem wundervollen Monitor - sogar in Farbe und toller Auflösung. Ich kann sogar bis 100 rechnen und zähle zur Überprüfung meine Dateien im Ordner, und siehe da. Was ich sah, ist gut, denn es sind tatsächlich 85 (fünfundachtzig) vorhanden. Soweit meine Logik also ausreicht, müssten die Daten im Model sein. Es kann ja auch sein, dass ich mir die angezeigten Dateien in diesem besagten Beispiel nur einbilde. In dem Falle entschuldige ich mich ehrwürdig bei dir.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du wiederholst dich andauernd. Du glaubst nicht, das es eine Model-basierte Lösung für dein Problem gibt. Be my guest. Verhedder dich in selbst erstellten Items und glaube, du hättest ein Problem, welches der Rest der Welt nicht schon lange gelöst hat :roll:

Das DU durch druck auf einen Button deine komplette Datenbankabfrage durchlaufen lässt, ist DEIN Privatvergnügen. Andere machen das halt für den Ausschnitt, der gerade gefragt ist. So wie sie auch nur einen Teil der hierarchischen Datenbank, die ein Filesystem darstellt, anzeigen. Statt erstmal alles abzugrasen.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Das fetchmore Beispiel scheint Daten in Batches von 100 zu laden, was jetzt auch nicht wirklich viel ist. 85 werden damit natürlich komplett geladen.

Gerade in so einem Kontext sollte man natürlich schon genug Daten generieren dass man mit einer nennenswerten Menge das Verhalten halbwegs realistisch testen kann.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

Eventuell einfach mit einem unendlichen Iterator wie `itertools.count` testen...
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@DasIch: Tatsächlich. Ich habe aus Bequemlichkeit die Zahl 100 auf 25 gesetzt. Jetzt erkenne ich zunächst optisch das Verhalten. Der erste Schritt zur Einsicht ist schon mal getan. Da ich mit QTreeView() arbeite, müsste ich wohl oder übel zusehen, dass ich die QStandardItemModel() überschreibe und neu implementiere. Ehrlich gesagt habe ich keine Ahnung. In den Beispielen von simpletreemodel und editabletreemodel wird stets mit QAbstractItemModel() gearbeitet. Heißt das jetzt für mich, dass ich von QStandardItemModel() zu QAbstractItemModel() wechseln muss? Das wird ein steiniger Weg für mich. Mein lieber Scholli. Und dann muss ich mir noch was einfallen lassen, wie die Daten aus der Datenbank bei Bedarf nachgeladen werden. Das heißt, es muss irgendwie eine Verbindung zwischen Model und der Datenbank existieren. Heiliger Strohsack.
Antworten