Hi,
ich will viele Bilder aus einem Internet laden und diese auf meine Festplatte speichern.
Allerdings habe ich das Problem, dass der Arbeitsspeicher langsam aber schnell voll wird.
Ich benutze einen ThreadPoolExecutor, um mehrere Bilder gleichzeitig downloaden zu können.
Mein Verständnis vom TPE ist, dass man eine maximale Anzahl von Threads angeben kann, die zur gleichen Zeit arbeiten können. Beendete Threads werden entfernt.
Also habe ich das so implementiert
Ich öffne eine Textdatei, wo Informationen zu den Bildern gegeben sind. Diese lade ich über "interpreteLines". In der Schleife erstelle ich mir ein DownloadRunner, der das Bild von der URL (die im Info-Object "inf" steht) runterlädt und abschließend als BufferedImage auf die Festplatte schreibt. Danach wird das BufferedImage geflushed (mit flush()).
Geschrieben werden die Bilder über ImageIO.
Was ist hier falsch? Wie geht es richtig? Wie kriege ich den memory leak in den Griff?
Eine vergebliche Lösung war es, eine BlockingQueue zu definieren und diese an den TPE zu übergeben, statt einer neu initialisierten BQ. Dann in der Schleife die erstellen DownloaderRunner per "put(dr)" dem TPE anzureichern. Allerdings passiert dann gar nichts.
Wäre nett, wenn mir jemand helfen könnte.
ich will viele Bilder aus einem Internet laden und diese auf meine Festplatte speichern.
Allerdings habe ich das Problem, dass der Arbeitsspeicher langsam aber schnell voll wird.
Ich benutze einen ThreadPoolExecutor, um mehrere Bilder gleichzeitig downloaden zu können.
Mein Verständnis vom TPE ist, dass man eine maximale Anzahl von Threads angeben kann, die zur gleichen Zeit arbeiten können. Beendete Threads werden entfernt.
Also habe ich das so implementiert
Code:
interpreteLines(list1, infos);
interpreteLines(list2, infos);
// ExecutorService executorService = Executors.newFixedThreadPool(MAX_THREADS);
int corePoolSize = 5;
int maxPoolSize = 10;
long keepAliveTime = 20;
ExecutorService executorService = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime,
TimeUnit.SECONDS, new LinkedBlockingQueue<>());
for (int i = 0; i < infos.size(); i++) {
Info inf = infos.get(i);
if (!(inf.getUrl().toLowerCase().endsWith(".jpg") || inf.getUrl().toLowerCase().endsWith("jpeg"))) {
System.out.println(inf.getUrl() + " kein JP(E)G!");
continue;
}
DownloadRunner dr = new DownloadRunner(inf, i);
executorService.execute(dr);
}
executorService.shutdown();
while (!executorService.isTerminated()) {
}
System.out.println("\nAlles gedownloaded");
Ich öffne eine Textdatei, wo Informationen zu den Bildern gegeben sind. Diese lade ich über "interpreteLines". In der Schleife erstelle ich mir ein DownloadRunner, der das Bild von der URL (die im Info-Object "inf" steht) runterlädt und abschließend als BufferedImage auf die Festplatte schreibt. Danach wird das BufferedImage geflushed (mit flush()).
Geschrieben werden die Bilder über ImageIO.
Was ist hier falsch? Wie geht es richtig? Wie kriege ich den memory leak in den Griff?
Eine vergebliche Lösung war es, eine BlockingQueue zu definieren und diese an den TPE zu übergeben, statt einer neu initialisierten BQ. Dann in der Schleife die erstellen DownloaderRunner per "put(dr)" dem TPE anzureichern. Allerdings passiert dann gar nichts.
Wäre nett, wenn mir jemand helfen könnte.