Anfängerfrage/Verständnissfrage

Alles rund um die Programmierung mit Qt
Antworten
textmitfunktion
Beiträge: 18
Registriert: 16. März 2010 17:30
Kontaktdaten:

Anfängerfrage/Verständnissfrage

Beitrag von textmitfunktion »

Hallo,

ich möchte viele Dateien einlesen (über Netzwerk), name, pfad und edliche Dateieiegenschaften speichern und diese dann miteinander vergleichen.

Meine Frage ist, wie man da am effektivsten rangeht?
Ich wollte erst alle Dateien einlesen und alles in einer DB ablegen (auf einem Server läuft eh schon eine mySQL, da wollte ich es reinpumpen) und dann mittels Abfragen vergleichen. Allerdings bin ich am implementieren von qmysql gescheitert und wollte bevor ichs nochmal versuche hier erstmal fragen obs noch andere Alternativen gibt. Ich dachte dabei an Qlist oder so.


viele Grüße,
tmf
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Lass die DB da raus! Um Daten zwischenzuspeichern, ist das totaler absoluter Overkill! Das wird langsam werden bei Lesenden Zugriffen, und überhaupt die Daten reinpumpen und danach Löschen - ich hoffe du speicherst Infos, die eh schon auf Dateisystemebene liegen nicht zusätzlich dauerhaft in einer DB, das wäre jedenfalls bei deinem jetzigen Kenntnisstand absolut unwartbar...

Du überlegst dir, welche Infos in der Datei liegen, in welcher Form die gespeichert sind, welche Daten dich auch für den Vergleich WIRKLICH interessieren. Dann schreibst du dir ein kleines struct, welches die Infos speichert (natürlich samt Dateinamen um den Datensatz identifizieren zu können), incl. Parser der die Dateien einliest. Diese structs schiebst du in eine QList. Jetzt kannst du sehr performant die einzelnen Objekte in der Liste miteinander vergleichen.

Und an dem wie du schreibst wäre es denke ich besser, wenn du dich erstmal mit (erweiterten) C++-Grundlagen beschäftigst.
Ich dachte dabei an Qlist oder so.
lässt erahnen, dass du bisher eher rätst als dass du weißt, und das ist gefährlich, frustrierend und zeitraubend.
textmitfunktion
Beiträge: 18
Registriert: 16. März 2010 17:30
Kontaktdaten:

Beitrag von textmitfunktion »

Hi Franz,

danke für die ausführliche Antwort
franzf hat geschrieben:Lass die DB da raus! Um Daten zwischenzuspeichern, ist das totaler absoluter Overkill! Das wird langsam werden bei Lesenden Zugriffen, und überhaupt die Daten reinpumpen und danach Löschen - ich hoffe du speicherst Infos, die eh schon auf Dateisystemebene liegen nicht zusätzlich dauerhaft in einer DB, das wäre jedenfalls bei deinem jetzigen Kenntnisstand absolut unwartbar...
Warum unwartbar?
Ich hatte mich, der Einfachheit halber, bewusst etwas kurz gefasst.
Aber ich sag jetzt mal worum es geht. Nämlich um die Informationen zu einigen tausend Videos, die zu vergleichen sind. Name,Pfad,Datum,Größe,Länge,Auflösung,Container,ACodec,VCodec,FPS,Interlace also alles was ein Video ausmacht. Ich werde die Videodaten vermutlich im Endeffekt eh in der DB speichern um sie händisch durchsuchen zu können. Aber erstmal reicht es wenn ich sie maschinell vergleichen kann. Darum halt die Frage, erst per Liste den Vergleich durchführen und dann in die DB tun. Oder erst in die DB und mittels DB Abfragen vergleichen.
franzf hat geschrieben: Du überlegst dir, welche Infos in der Datei liegen, in welcher Form die gespeichert sind, welche Daten dich auch für den Vergleich WIRKLICH interessieren. Dann schreibst du dir ein kleines struct, welches die Infos speichert (natürlich samt Dateinamen um den Datensatz identifizieren zu können), incl. Parser der die Dateien einliest. Diese structs schiebst du in eine QList. Jetzt kannst du sehr performant die einzelnen Objekte in der Liste miteinander vergleichen.
Ok, warte, das wäre in meinem Fall ja eine 2 dimensionelles Array (einfach relational). Hier meinen sie das man dafür lieber QVector nehmen sollte. :?:

vG
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

textmitfunktion hat geschrieben:Warum unwartbar?
Weil Dateien normalerweise die unangenehme Eigenschaft haben, sich zu ändern. Wenn die Dateien dann auf einem anderen Server liegen muss dein Programm immer schauen, ob und was sich ändert und das entsprechend in die DB schreiben. Da du dort keinen QFileSystemWatcher installieren kannst, der dir mitteilt wann sich etwas ändert, darfst du brav pollen. Oder du schreibst dir eine Server-Applickation, auf die du connectest, die dir über Netzwerk entsprechende Änderungen mitteilt.
Ich hatte mich, der Einfachheit halber, bewusst etwas kurz gefasst.
Aber ich sag jetzt mal worum es geht. Nämlich um die Informationen zu einigen tausend Videos, die zu vergleichen sind. Name,Pfad,Datum,Größe,Länge,Auflösung,Container,ACodec,VCodec,FPS,Interlace also alles was ein Video ausmacht.
Und wie du gesehen hast, ist das was man weglässt meistens das entscheidende. Du hast nicht geschrieben, dass die Daten wahrscheinlich eh in die DB geschrieben werden, was meinen ersten Kommentar überflüssig macht, genauso dass es Videos sind, die im Gegensatz zu gewöhnlichen Dateien praktisch nie mehr geändert werden (umkodiert, beschnitten, etc).
Darum halt die Frage, erst per Liste den Vergleich durchführen und dann in die DB tun. Oder erst in die DB und mittels DB Abfragen vergleichen.
Da wäre etwas mehr Ausführlichkeit auch nicht schlecht. Vergleichen ist so relativ. Z.B. braucht man Vergleiche um zu sortieren. Z.B. nach Länge. Dafür kannst du dir nen Funktor/Funktion schreiben, um nach speziellen Kriterien zu sortieren.
Vergleich kann auch heißen "Vergleiche Produkt A mit Produkt B" - also eine Gegenüberstellung von $num verschiedenen, vorher selektierten Elementen.
Zu guter letzt kann es auch heißen, alle Elemente auszulesen und in eine Tabelle zu legen und einfach oben den ColumnHeader anklicken, um alle Daten nach einem bestimmten Kriterium in der Tabelle zu sortieren (also "visueller Vergleich").

Im Prinzip kannst du Sortierarbeiten schon direkt mit einem passenden SQL-Query erledigen. Es wäre jetzt nicht schlecht, wenn du sagst, was "Vergleichen" heißt, dann kann man dich in eine bestimmte Richtung schubsen :)
Ok, warte, das wäre in meinem Fall ja eine 2 dimensionelles Array (einfach relational). Hier meinen sie das man dafür lieber QVector nehmen sollte. :?:
Äh, du hast doch QList selber vorgeschlagen? Egal. Du hast den Post glaube ich absolut nicht verstanden. Du brauchst kein 2-dimensionales Array, deine Daten sind flach (pro existierender Dtaei ein MetaObject). QList und QVector haben andere Unterscheidungsmerkmale. schnelles insert in der Mitte der Liste vs. (potentiell) schnelleren RandomAccess. Steht aber recht ausführlich in der Doku.
odenter
Beiträge: 36
Registriert: 5. Dezember 2009 10:02

Beitrag von odenter »

- Mach Dir wie vom Vorposter beschrieben eine Struktur mit allen nötigen Infos
- Lauf Dein Verzeichnis durch, und lese die entsprechenden Infos in die Struktur ein, die Struktur kommt in eine Liste
- Dann bauste Dir ne Funktion mit welcher Du den Listeninhalt in eine einfache Datei speicherst (geht bei struct's total simpel auch das spätere einlesen)
- Eine zweite Funktion um die Daten aus der Datei wieder in die Liste zu laden
- Und als letztes baust Dir einen einfachen Dialog, der benutzt die "laden" Funktion um Deine gesammelten Infos aus der Datei zu laden und ein paar Textboxen für eine Suche.
Jetzt brauchst Du nur noch durch Deine Liste laufen und jedes Element gegen Deine Suchbedingungen prüfen und in eine zusätzliche Liste packen und die Ergebnisse anzeigen.
Antworten