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
Anfängerfrage/Verständnissfrage
-
textmitfunktion
- Beiträge: 18
- Registriert: 16. März 2010 17:30
- Kontaktdaten:
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.
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.
lässt erahnen, dass du bisher eher rätst als dass du weißt, und das ist gefährlich, frustrierend und zeitraubend.Ich dachte dabei an Qlist oder so.
-
textmitfunktion
- Beiträge: 18
- Registriert: 16. März 2010 17:30
- Kontaktdaten:
Hi Franz,
danke für die ausführliche Antwort
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.
vG
danke für die ausführliche Antwort
Warum unwartbar?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...
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.
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.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.
vG
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.textmitfunktion hat geschrieben:Warum unwartbar?
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).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.
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.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.
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
Ä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.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.![]()
- 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.
- 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.