Große Anzahl Bilder laden

Status
Nicht offen für weitere Antworten.

OneTwo

Mitglied
Hallo Leute.

Ich möchte Bilder in eine JList-Laden. Es soll lediglich eine Preview der Bilder angezeigt werden, also ein kleines Thumbnail. Es können durchaus auch größere Mengen Bilder in die Liste geladen werden. Derzeit versuche ich sie über BufferedImage mit getScaledImage zu laden. Leider ist das sehr speicherhungrig, so dass die Anwendung irgendwann mit einem heap overflow baden geht. Bereits bei rund 200 Bildern ist der Speicher voll. Die Heapsize zu erhöhen ist für mich keine Lösung.

Meine Frage: Gibt es einen performanten Weg Bilder als Thumbnails in einer Liste darzustellen? Evtl. eine andere Komponente als die JList?

Wie gesagt, es sollen nur Thumbnails, anhand derer die eigentlichen Bilder ausgewählt werden können, angezeigt werden.

Vielen Dank schon mal und Gruß
 

Wildcard

Top Contributor
Du kannst dir relativ leicht ausrechnen wie viel Speicher du pro Bild brauchst. Es hängt davon ab welches ColorModel verwendet wird und wie groß die Pixel Fläche ist.
Kommst du zu dem Schluß das du mehr Bilder brauchst als du im Speicher halten kannst/willst, kommst du rein physikalisch nicht um Caching herum.
 

OneTwo

Mitglied
Danke für die schnelle Antwort.

An solchen Lösungen bin ich ja im Prinzip interessiert. Mit dem physikalischen Speicher werde ich nicht hinkommen. Was genau meinst Du denn mit Caching? Nur die Bilder laden, die zum Betrachtungszeitpunkt angezeigt werden?

Ich habe leider schon länger vergebens nach Beispielen dafür gesucht. Gibt es ein Best-Practice für solche Probleme?
 

Wildcard

Top Contributor
Eine einfach Lösung kann zB so aussehen:
Schreib einen Renderer für die JList oder was auch immer du nehmen willst. Der Renderer besorgt sich die Bilder dann aus einem Cache. Merkt der Cache das er das angefragte Bild nicht vorrätig hat, lädt er es nach und gibt es zurück.
Der Cache muss nun entscheiden wann er ein Bild wieder aus dem Speicher wirft. Eine einfache, aber nicht besonders clevere Strategie wäre zB die Bilder in SoftReferences zu speichern. Die VM gibt sie dann frei sobald mehr Speicher benötigt wird als vorhanden ist. Der Nachteil ist, das du keine Kontrolle darüber hast welche Bilder entfernt werden und welche nicht.
Wenn du aufgrund deines Use-Case bestimmte Annahmen treffen kannst welche Bilder vermutlich nicht mehr benötigt werden, dann kannst du auch deine eigene Caching Strategie entwickeln. Etwas aufwendiger, aber wahrscheinlich performanter.
 

newcron

Aktives Mitglied
Du kommst auch mit deutlich mehr Bildern im speicher hin, wenn du es nur richtig anstellst. Ich Spiele derzeit mit 1000 Bildern (im speicher und gleichzeitig auf dem Bildschirm) herum, und habe keine Performanceprobleme auf einem Steinzeit-PC.

Was ich mache: ich lade die Bilder einzeln, erstelle von ihnen ein Thumbnail und schmeiße die originale weg. Dazu habe ich noch eine Wrapperklasse, die ein Bild abstrahiert, mit der ich das Originalbild bei bedarf nachladen kann. Die entsprechende methode hat noch einen booleschen Parameter, der festlegt, ob das originalbild gecached werden soll (sie also eine referenz auf dieses bild behält) oder nicht.

Funktioniert prima! :)
 

Wildcard

Top Contributor
Wie gesagt: es ist eine einfache Rechnung:
Wieviel Speicher x steht zur Verfügung
Wieviel Bilder y können maximal benötigt werden
Wieviel Speicher z braucht jedes einzelne Bild (Größe mal bytes pro Pixel)

Wenn y*z>x dann braucht man eine Caching Strategie, ansonsten nicht.

habe keine Performanceprobleme auf einem Steinzeit-PC.
Das ist auch keine Performance Frage, sondern ein Frage ob der Heap ausreicht.
 

OneTwo

Mitglied
Schreib einen Renderer für die JList oder was auch immer du nehmen willst. Der Renderer besorgt sich die Bilder dann aus einem Cache.

Der Renderer muss bei der Lösung jedoch dafür Sorge tragen, dass er nur die Bilder vom Cache abfragt, die auch gerade angezeigt werden sollen. Ansonsten wäre das Problem des Ladens *aller* Bilder ja nur von der eigentlichen Anwendung in die Cache-Anwendung verschoben. Wenn ich Dich richtig verstehe, meinst Du mit Cache einen Thread/ein seperate Anwedung, quasi einen Proxy?

Was ich mache: ich lade die Bilder einzeln, erstelle von ihnen ein Thumbnail und schmeiße die originale weg.

Wie genau stellst Du das denn an? Im Prinzip wollte ich es auch so machen.
- Bild mittels ImageIO in ein BufferedImage laden
- BufferedImage via getScaledImage verkleinern (Thumbnail-Größe)
- Thumbnail der JList hinzufügen => nächstes Bild.

Klar ist, dass er so natürlich jedes Bild erstmal vollständig in den Speicher lädt. Da werde ich ja auch nicht drumrum kommen, wenn ich on-the-fly die Thumbnails erstellen will. Aber wie bereits geschrieben ist da bereits bei weniger als 200 Bildern schluss. Eigentlich sollte sich der GC doch darum kümmern die nicht mehr referenzierten Bilder aus dem Speicher zu entfernen.

Generell vielleicht noch mal kurz die Problemstellung etwas näher erläutert:
Der Nutzer des Programms soll einen beliebigen Ordner auf der Platte wählen können und die Bilder dann in der GUI als Thumbnails dargestellt bekommen. Im Prinzip eine einfache Thumbnail-Ansicht wie im Windows Explorer etc. Hieraus kann er sich bestimmte Bilder aussuchen für die weitere Arbeit mit diesen. Die Thumbnails muss ich also on-the-fly erstellen.
 
Zuletzt bearbeitet:

Wildcard

Top Contributor
Der Renderer muss bei der Lösung jedoch dafür Sorge tragen, dass er nur die Bilder vom Cache abfragt, die auch gerade angezeigt werden sollen. Ansonsten wäre das Problem des Ladens *aller* Bilder ja nur von der eigentlichen Anwendung in die Cache-Anwendung verschoben. Wenn ich Dich richtig verstehe, meinst Du mit Cache einen Thread/ein seperate Anwedung, quasi einen Proxy?
Der Code der JList ruft den Renderer nur auf den sichtbaren Elementen auf (sollte er zumindest).

Aber wie bereits geschrieben ist da bereits bei weniger als 200 Bildern schluss. Eigentlich sollte sich der GC doch darum kümmern die nicht mehr referenzierten Bilder aus dem Speicher zu entfernen.
Rechne doch erstmal nach ob das bei bei dir auch hinkommt. Wenn nicht, dann können die Originale nicht aus dem Speicher gelöscht werden, weil du sie noch irgendwie referenzierst. Die VisualVM und ein Heap-Dump können dir dabei helfen.

Generell vielleicht noch mal kurz die Problemstellung etwas näher erläutert:
Der Nutzer des Programms soll einen beliebigen Ordner auf der Platte wählen können und die Bilder dann in der GUI als Thumbnails dargestellt bekommen. Im Prinzip eine einfache Thumbnail-Ansicht wie im Windows Explorer etc. Hieraus kann er sich bestimmte Bilder aussuchen für die weitere Arbeit mit diesen. Die Thumbnails muss ich also on-the-fly erstellen.
Nun, alle mir bekannten 'Explorer' berechnen Thumbnails zwar on-the-fly und bei Bedarf, persistieren die Thumbnails dann aber. Bei win32 ist das eine thumbs.db pro Verzeichnis, bei GTK zb ein .thumbnail im Home Verzeichnis.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Best Practice Große Anzahl an Objekten speichern und lesen Allgemeine Java-Themen 19
B Welcher Datentyp für sehr große Zahlenbereiche? Allgemeine Java-Themen 1
F Große Datenmengen effizient programmieren Allgemeine Java-Themen 51
N Das große O berechnen Allgemeine Java-Themen 2
R Große Zahlen in Worten abkürzen Allgemeine Java-Themen 10
K Große JSON-Dateien schnell und effizient verarbeiten Allgemeine Java-Themen 16
K Große Mengen an Daten speichern Allgemeine Java-Themen 9
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
E Best Practice Verdammt große Objekte Allgemeine Java-Themen 10
P Große Datenstruktur im Speicher halten Allgemeine Java-Themen 13
M Einfluss von Caching auf die Performance (große Arrays) Allgemeine Java-Themen 24
U Große Liste von Strings mit indiziertem Zugriff Allgemeine Java-Themen 31
P Datentypen Große Datenmenge Sortiert halten Allgemeine Java-Themen 12
D große Textdatei filtern Allgemeine Java-Themen 13
M Große Datei mit Regex durchsuchen Allgemeine Java-Themen 4
R POI große Exceldatei schreiben Allgemeine Java-Themen 7
R Dateigestützte Collection für große Datenmengen Allgemeine Java-Themen 5
K Scanner - große Textfile, nur 0 ab betim. Wert Allgemeine Java-Themen 4
trash Das große Problem: .jar Archiv Allgemeine Java-Themen 19
J Große Datei einlesen und gestückelt verarbeiten Allgemeine Java-Themen 4
I Große Datei am effektivsten/performantesten auslesen und auswerten? Allgemeine Java-Themen 6
S große CSV-Dateien Importieren. Beste Lösung ?! AWS,S3,Hadoop!? Allgemeine Java-Themen 4
P große double Zahlen und modulo Allgemeine Java-Themen 8
A Mit RegEx große Dokumente erfassen Allgemeine Java-Themen 14
X Wie verdammt große Datein öffnen? Allgemeine Java-Themen 2
G Große Datenmengen per JDBC Allgemeine Java-Themen 5
P Große Datenmenge wie speichern (HashMap? TreeMap?) Allgemeine Java-Themen 11
G Große XML-Dateien einlesen und auswerten . Allgemeine Java-Themen 2
P Performance: Ziehen ohne Zurücklegen (große Datenmenge) Allgemeine Java-Themen 10
I JNI - Große Daten übertragen Allgemeine Java-Themen 6
T Große Dateibestände löschen - Speicherproblem Allgemeine Java-Themen 20
S Große ArrayListen Allgemeine Java-Themen 8
S große Datei einlesen! Allgemeine Java-Themen 7
J Große Zahl (double) as text ausgeben? Allgemeine Java-Themen 2
S Kleines Eclipse Problem, große Wirkung Allgemeine Java-Themen 7
H Referenzen statt Objekte für große Speicherstrukturen Allgemeine Java-Themen 19
K Große Herausforderung Allgemeine Java-Themen 2
F Zu große Werte beim byteweisen Lesen mit BufferedReader.read Allgemeine Java-Themen 5
D Große Klasse - was fällt euch so ins Auge? Kritik bitte! Allgemeine Java-Themen 10
M Große Dateien laden Allgemeine Java-Themen 2
F Große Dateien schnell einlesen Allgemeine Java-Themen 14
BeginnerJava Anzahl der 5 % - Zuwächse ausgeben Allgemeine Java-Themen 6
M Wie übergebe ich den Zähler für die Anzahl Rekursionsschritte korrekt? Allgemeine Java-Themen 2
S BlockingQueue mit dynamischer Anpassung der Anzahl von Producer und Consumer Threads Allgemeine Java-Themen 1
S Iterable<?> anzahl der Element Allgemeine Java-Themen 14
M Java- Bild gewissen Anzahl von Sekunden anzeigen?! Allgemeine Java-Themen 4
M Relative Anzahl an verschachtelten Forschleifen Allgemeine Java-Themen 8
The Pi Anzahl der Gewichtscheiben berechnen Allgemeine Java-Themen 11
P Threads Parallelisierte DB-Abfragen mit variabler Anzahl an Threads Allgemeine Java-Themen 4
Soloeco BubbleSort Anzahl der Vertauschungen Allgemeine Java-Themen 9
J Anzahl geöffneter Plugins Allgemeine Java-Themen 3
A Anzahl an Threads Systemweit Allgemeine Java-Themen 2
J Anzahl von Möglichkeiten zur Verteilung von Kugeln in Behälter Allgemeine Java-Themen 3
P Erste Schritte Dynamische Anzahl von verschachtelten Schleifen Allgemeine Java-Themen 5
E ArrayList Anzahl der gleichen Elemente Allgemeine Java-Themen 4
R Int werte vergleichen und Anzahl Paare ausgeben Allgemeine Java-Themen 4
L Ermitteln der Anzahl an Lösungen von quatratischen Gleichungen (Sieb von Atkin) Allgemeine Java-Themen 1
L Anzahl der Tage eines Monats Allgemeine Java-Themen 3
P Auf die Anzahl der Joins achten beim WS design Allgemeine Java-Themen 1
J Anzahl der Zeichen bei Eingabe begrenzen Allgemeine Java-Themen 5
S Zur Laufzeit Klasse mit einer anzahl von X Objekten erstellen Allgemeine Java-Themen 5
M Eingabe von Arrays geht über gewünschte Anzahl hinaus Allgemeine Java-Themen 2
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
P Anzahl vo Einträgen in verschiedenen Sets Allgemeine Java-Themen 3
R Anzahl der gerade gedrückten Tasten Allgemeine Java-Themen 6
J ermitteln der Anzahl der Monate Allgemeine Java-Themen 7
M Anzahl der Durchläufe einer Funktion errechnen Allgemeine Java-Themen 6
G Anzahl Primzahlen im Intervall Allgemeine Java-Themen 3
X Textdatei auf gewünschte Anzahl der Zeilen kürzen Allgemeine Java-Themen 2
M Anzahl Farbwerte (RGB) im Array speichern - Problem Allgemeine Java-Themen 13
N variable Anzahl von Objektinstanzen zur Laufzeit erstellen Allgemeine Java-Themen 4
D unbekannte Anzahl checkboxes Allgemeine Java-Themen 2
TiME-SPLiNTER Unbekannte Anzahl serialisierter Objekte lesen Allgemeine Java-Themen 2
Iron Monkey Anzahl der Monate ermitteln Allgemeine Java-Themen 17
neonfly Anzahl Zeichen pro Zeile auf der Konsole Allgemeine Java-Themen 8
R ArrayList -- Maximale Anzahl an Elementen Allgemeine Java-Themen 2
S Array: Anzahl Elemente mit best. Wert zählen Allgemeine Java-Themen 4
V Java-Objekt. wie groß maximal ? anzahl der einträge Allgemeine Java-Themen 4
M Aus Anzahl Tagen Datum ermitteln Allgemeine Java-Themen 8
M JTable: Anzahl Zeichen bei Eingabe Allgemeine Java-Themen 2
T Anzahl Tage zwischen zwei Daten - Stunde fehlt? Allgemeine Java-Themen 2
S Anzahl der Stunden in Excel Datei schreiben Allgemeine Java-Themen 2
G Anzahl an Tagen auf Datum addieren Allgemeine Java-Themen 4
MQue Anzahl der Ziffern Allgemeine Java-Themen 13
G Anzahl Tage in Datum umwandeln Allgemeine Java-Themen 13
MQue Anzahl der Kommastellen Allgemeine Java-Themen 6
L Anzahl Tage zwischen zwei Kalenderdaten Allgemeine Java-Themen 5
F Anzahl der nachkommastellen bestimmen nur wie? Allgemeine Java-Themen 10
M Aktualisieren eines Chatprofils (Anzahl Minuten) Allgemeine Java-Themen 4
G Variable Anzahl JTextfleder Allgemeine Java-Themen 3
S Bandbreite/Anzahl Pakete messen Allgemeine Java-Themen 3
V String formatiert ausgeben ( gleiche Anzahl von Ziffern ) Allgemeine Java-Themen 5
padde479 Anzahl Methodenaufrufe Allgemeine Java-Themen 7
J Matrix mit unterschiedlicher Anzahl von Spalten pro Zeile? Allgemeine Java-Themen 4
F Datum mit anzahl tagen berechnen Allgemeine Java-Themen 3
W PrepareStatement und Anzahl der Datensätze Allgemeine Java-Themen 2
rambozola anzahl zeichen in konsole eclipse begrenzt? Allgemeine Java-Themen 5
G anzahl "verwendeter" elemente eines arrays ermitte Allgemeine Java-Themen 2
M Anzahl der Threads pro Programm? Allgemeine Java-Themen 3
R java.lang.String maximale Anzahl der Zeichen Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben