Performance Problem: Datenhaltung

Flo<H>

Erfahrenes Mitglied
Hallo!
Ich programmier grad ein Programm, welches ID3Tags von MP3s ausliest und diese in einer JTable datstellt. Problem ist jetzt, wie ich die Daten meinem TableModel bereitstellen soll.
Erster Versuch war die Objekte der Mp3-Lib in einer Liste zu speichern. Somit hätte ich jederzeit Zugriff auf alle Informationen der Datei die ich brauche. Nur erhalte ich bei sehr vielen Dateien ein Problem mit meinem Heap Space.
Zweiter Ansatz ist, dass ich alle Daten vom ID3Tag die ich brauche auslese und in einer Map speichere. Das TableModel hat dann eine Liste von Maps als Content. Damit läuft das Programm auch noch, wenn ich gut 9000 Mp3s reinlade, wobei die Speicherauslastung doch ein wenig hochgeht.
Meine Frage ist jetzt, ob es dafür eine bessere Lösung gibt. Ich brauche pro Datei ca. 22 Strings, wovon ich 9 in der Tabelle darstelle. 4 Strings könnte ich on-the-fly nachladen, da diese nur angezeigt werden wenn eine Datei markiert ist.
Eine weitere Möglichkeit, die ich bis jetzt aber noch nicht ausprobiert habe, ist eine Datenbank zu verwenden, und die Daten aus dieser zu laden.
bin für jede Meinung dankbar :-) flo
 
hmm 9000 MP3 ist natürlich einiges, könntest du mal beschreiben in welchem Zusammenhang die alles gebraucht werden?
Also nur einmal übergeben in einem Container zum Darstellen oder soll mit den Datensätzen auch später noch in irgendeiner Weise interagiert werden?
 
Also die Tabelle besitzt die Spalten:
- Filename
- Dateipfad
- Titel
- Artist
- Album
- Tracknumber
- Year
- Comment
- Genre
Die Map zu einem File beinhaltet zur Zeit diese 9 Werte plus nocheinmal Titel, Artist, Tracknumber, Year, Comment und Genre, da wahlweise ID3v1 oder ID3v2 angezeigt werden kann. Zudem wird in der Map noch Bitrate, Frequenz, Länge und Größe gespeichert. Macht also zwanzig Map-Einträge pro Mp3. Bitrate, Frequenz, Länge und Größe werden nur in einer Sidebar dargestellt (immer die Werte von dem aktuell markierten File).
Die Werte soll man später über den Editor in der Sidebar (vgl. Anhang) verändern können.
Wie gesagt im Augenblick läuft es so, dass ich die Files in ein MP3-File lade, die Werte auslese, diese in einer Map speichere und das MP3-File wieder zerstöre. Zum editieren würde ich das File wieder in ein MP3-File laden und die neuen Werte speichern. Da ja nicht immer alle MP3s geändert werden dürfte das speichern das kleinere Problem sein.
Aber vielleicht gibt es ja eine bessere Möglichkeit diese Werte die zur Zeit in einer Liste aus Maps stehen resourcenschonender zu verwalten.
mfg flo
 

Anhänge

  • jmp3.jpg
    jmp3.jpg
    14,9 KB · Aufrufe: 47
Hallo,

also ich würde mir wohl eine Art Index (Über ein RandomAccessFile) aufbauen in dem ich einmal über alle MP3's drüber laufe und mir die entsprechenden Informationen extrahiere. (wenn ein neus File hinzukommt füge ich es an entsprechender Stelle im index neu ein) Anschließend würde ich im Tablemodel nur den aktuell sichtbaren Ausschnitt aus den Indexdaten anzeigen. Dabei reicht es dann, wenn man weis welche die oberste und die unterste
sichtbare Zeile ist (+ einem "Scroll bereich von vielleicht 10 weiteren Sätzen davor und dahinter).
Daraus würde ich dann die entsprechenden Offsets errechnen um die passenden Stellen im Index zu finden.

Ansonsten kann man das ganze natürlich dadurch beschleunigen, dass man nicht die ganze Zeit von der Platte liest sondern im Speicher mit den Daten arbeitet.

Wie man solch eine Art Index bauen könnte findest du hier:
http://www.tutorials.de/forum/swing...ossen-datei-auslesen-bzw-diese-anhaengen.html

Gruß Tom
 
Hallo!
Vielen Dank, die Idee hört sich toll an. Werd ich dann morgen gleich mal ausprobieren. Du hast mich aber mit dem Index noch auf eine weitere Idee gebracht, das muss ich mir auch nochmal überlegen.
mfg flo
 
Eine Idee wäre vielleicht noch über eine XML-File. Ich kann dir nicht erklären wie, aber iTunes macht es so. :-)
 
Hallo!
Nur um kurz zu zeigen was aus meinem Problem geworden ist (falls es jemanden interessiert :-)).
Nachdem ich seit 5 Monaten nichts mehr dran gemacht habe, arbeite ich seit gestern wieder an dem Programm weiter. Die Datenhaltung übernimmt jetzt eine HSQLDB, die im In-Prozess-Modus läuft.
Beim Start wird Alles ausgelesen und in der DB gespeichert. Habs grad mit über 11000 Files getestet (pro File 20 Strings in der DB). Wenn man den Scrollbalken mit der Maus verschiebt laggt es ein wenig, aber normales Scrollen macht keine Probleme. Und das Wichtigste, ich hab keine Speicherprobleme mehr :-)
Außerdem ist das Auslesen aus der Datenbank noch etwas unperformant gelöst: jeder Aufruf von getValueAt im TableModel baut eine Verbindung zur Datenbank auf und ruft nur den einen Wert ab.
Also mittlerweile läufts und mit ein paar Änderungen (performanteres Auslesen aus der Datenbank und evtl. einem kleinen Cache) kanns ja dann nur noch besser werden ;-)

mfg flo
 
Zurück