Re: Probleme mit der mAirList DB!!

Ja danke, ich habe mich gut erholt, und arbeite gerade hart daran, dass das so bleibt :slight_smile:

Zum Thema:

Ich habe gerade nochmal ein paar Recherchen angestellt und danach, auf der Terrasse sitzend, mit einer Flasche Kronen Pils und einem Schuss Fanta über die Geschichte meditiert.

Zunächst ist zu sagen, dass die eigentliche Suche - also der Teil, der im Datenbankserver (bzw. SQLite) abläuft - doch relativ schnell ist. Eine Suche nach “the” in einer Datenbank mit ca. 100.000 Titeln dauert nur 1-2 Sekunden. Der jetzige Zeitaufwand entsteht also nur bei der Verarbeitung der Ergebnisse. Hier muss man grundlegend zwischen der mAirListDB-Verwaltung und mAirList selbst unterscheiden:

In der Datenbankverwaltung ist das ListView-Objekt (genauer: Virtual Treeview, aber das spielt hier keine Rolle) in der GUI direkt mit dem ResultSet der Datenbank verbunden. Das heißt unter anderem, die Details (Titel, Interpret, Länge; mehr wird zunächst nicht abgefragt) werden erst übertragen, wenn sie benötigt werden, wenn man also in der Liste zu dem fraglichen Element scrollt. Daher dauert die Suche dort nur 3-4 Sekunden, die Verzögerungen beim Herunterblättern sind kaum wahrnehmbar.

Bei mAirList selbst sieht es anders aus. Hier ist eine direkte Verknüpfung zwischen dem ListView und dem SQL-ResultSet nicht möglich. Allein schon deshalb, weil es sich ja nicht bei allen Datenbanken um SQL-Datenbanken handelt (siehe: iTunes). Daher wird hier ein anderer Weg eingeschlagen: Es werden zunächst nur die IDs der passenden Titel ermittelt, und dann werden für jeden Titel mit weiteren SQL-Anfragen die Details aus der Datenbank gefischt. Und diesmal wirklich alle - heraus kommt jeweils ein vollständiges PlaylistItem. Die Ergebnisse werden dann mit den PlaylistItems aus den anderen Datenbanken (wenn man in allen gleichzeitig sucht) in eine Gesamt-“Playlist” zusammengeführt und angezeigt (das verwendete ListView-Objekt ist identisch mit dem, was z.B. für die Darstellung des Container-Inhalts oder des Papierkorbs verwendet wird).

Der zweite Schritt - das Ermitteln der Details für jeden Treffer, um jeweils ein vollwertiges PlaylistItem aufzubauen - ist derjenige, der Zeit kostet. Hier muss ich ansetzen.

Ich sehe zwei Lösungsmöglichkeiten, die unterschiedliche Auswirkungen auf die Bedienung und Usability haben, und die ich daher hier zur Diskussion stellen möchte:

  1. Es wird wie bisher zunächst nur die Liste der IDs aus der Datenbank geladen. Diese wird an einen Hintergrundthread übergeben, der nun nach und nach die PlaylistItems erzeugt und in die Ergebnisliste einträgt. Anders als bisher geschieht das allerdings im Hintergrund, mAirList bleibt also weiter bedienbar, der Benutzer sieht, wie sich die Einträge nach und nach aufbauen, und der Vorgang lässt sich im Zweifel auch einfach abbrechen. Tut man es nicht, dauert es ähnlich lange wie jetzt, bis alle Ergebnisse vorliegen. Es ist weiterhin möglich, alle Datenbanken gleichzeitig zu durchsuchen.

  2. Ich ermögliche - durch eine zusätzliche Abstraktionsschicht - eine direkte Ankopplung des ListViews an das SQL-ResultSet. Es werden erst nur Titel, Interpret und Länge aus der Datenbank geholt, die eigentlichen PlaylistItems werden erst dann erzeugt, wenn man ein Element tatsächlich verwendet. Die Performance entspräche in etwa dem, was wir jetzt schon bei der Suche in der Verwaltungssoftware haben: In meinen Tests ca. 4-5 Sekunden, in denen allerdings die GUI hängt. Allerdings kann man dann nur noch in einer Datenbank auf einmal suchen.

Ich bin etwas unentschlossen, welche der Möglichkeiten ich bevorzuge. Ich tendiere zu Nummer 1. Vor allem ist die leichter zu implementieren, weil weniger Änderungen am Browser vorzunehmen sind. Der Nachteil ist, dass die Suche “bis zum bitteren Ende” noch immer genauso lange dauern kann wie jetzt. Man darf sich aber die Frage stellen, wie sinnvoll eine Suche ist, die zigtausend unübersichtliche Ergebnisse zurückliefert. Wenn der Benutzer sieht, dass die Liste zu lang wird, wird er die Such eher abbrechen (das ist dann möglich) und den Suchbegriff verfeinern.

Was denkt ihr?

Ich tendiere auch zur 1

Ah, Timo ist noch wach :wink: Dann darf ich mir folgende Anmerkung erlauben: Ich habe gestern gesehen, was passiert, wenn man bei dem System mit dem Z am Anfang eine Suchanfrage startet, die zu viele Ergebnisse zurückliefert. Das fällt für mich unter “Möglichkeit 3” und steht nicht zu Diskussion :wink:

PS: Meine Frau sagt, rot steht mir.

Hallo Torben,
ich tendiere auch zu Variante 1.
Alleine schon deshalb wenn ein nervöser Mod kurz vor Lied Ende noch ne Suchanfrage eingibt. Und nach Murphy dauert genau diese anfrage mehrere Sekunden und der Track ist zu Ende lach.
Wenn man kenntlich macht das die Ausgabe der DB noch nicht beednet ist so kann man gut damit leben (macht Windoof ja auch durch den wandernden Balken)

Aber könnte man nicht eine Kombination aus 1 und 2 machen?
Du übergibst die ID’s an den Hintergrundthread und von dort aus nur Länge Titel Interpret geholt und angezeigt. Wenn man es dann nutzt wird das Item gebaut.

Obwohl, würde diese Art nicht die Suchmöglichkeit in vielleicht späteren Versionen einschränken? Bsp. Suche nach Jahr?

Grüße

Hi Torben,

ja, bei Z dauert das sehr lange…die haben allerdings noch eine kleine Anzeige dran…Item XXXXXXX von XXXXXXXX…dann sehe ich, wie schnell die Suche vorankommt…bzw. wie weit die Suche schon ist…

Hallo Torben,

ich hoffe die e-Mail ist angekommen.

Gruß
Paul

Ja, ist sie, und ich habe mich auch schon eingehend damit beschäftigt :slight_smile:

Zu der Zeitverzögerung beim Verschieben muss man wissen, dass sie sich aus zwei Teilen zusammensetzt: Dem eigentlichen Verschieben, und dem Neuladen der aktuellen Liste. Insbesondere bei letzterem habe ich durch Änderungen am Schema so einiges optimieren können (für Insider: die items-Tabelle hat nun ein Feld “artists”, wo redundant die Namen der Interpreten als einzelner zusammengesetzter String gespeichert wird - es entfällt der Join mit item_artists). Eine Verschiebeoperation dauert hier auf meinem Rechner nun nur noch ca. 1-2 Sekunden.

Wegen der Suche werde ich mich gleich daran machen, die Variante 1 zu implementieren. Peter hat schon recht - man könnte die Varianten auch miteinander kombinieren, Ausgangspunkt wäre aber in jedem Fall die Suche im Hintergrund, weswegen ich diese nun zunächst mal implementiere. Wenn es dann noch immer zu langsam ist, sehen wir weiter :slight_smile:

Hallo @ all.
also ich tendiere zu Vorschlag 1
Wenn ich das alles richtig verstanden habe wird es doch dann so sein, dass, wenn ich auf abbrechen gehe die bis dahin gefundenen Titel sichtbar bleiben. Wie ist es dann denn wenn ich die Titel von dem Brouser in den Player ziehe, dauert das einfügen dann länger. Nachteilig finde ich bei vorschlag 2 dass die Gui hängen bleibt.
Gruß Jockel

Alles längst erledigt, siehe Thread “Build 592” im Bugs-Forum :slight_smile:

mega hammer geil,
so kann eine Datenbanksuche sein. Heute abend gleich mal live testen.