Optimieren der parallelen Verarbeitung vieler Dateien

Ich habe ein Programm, das viele Dateien verarbeitet, wobei für jede Datei zwei Dinge getan werden müssen: Zuerst wird ein Teil der Datei gelesen und verarbeitet, und dann das ErgebnisMyFileData wird gespeichert. Der erste Teil kann parallelisiert werden, der zweite nicht.

Das sequentielle Ausführen ist sehr langsam, da die CPU auf den Datenträger warten muss, dann ein bisschen arbeitet und dann eine weitere Anforderung ausgibt und erneut wartet ...

Ich habe folgendes gemacht

class MyCallable implements Callable<MyFileData> {
    MyCallable(File file) {
        this.file = file;
    }
    public MyFileData call() {
        return someSlowOperation(file);
    }
    private final File file;
}

for (File f : files) futures.add(executorService.submit(new MyCallable(f)));
for (Future<MyFileData> f : futures) sequentialOperation(f.get());

und es hat sehr geholfen. Ich möchte jedoch zwei Dinge verbessern:

DassequentialOperation wird in einer festen Reihenfolge ausgeführt, anstatt das zuerst verfügbare Ergebnis zu verarbeiten. Wie kann ich das ändern?

Es müssen Tausende von Dateien verarbeitet werden, und das Starten von Tausenden von Festplattenanforderungen kann zum Papierkorb führen. Durch die NutzungExecutors.newFixedThreadPool(10) Ich habe diese Anzahl begrenzt, suche aber nach etwas Besserem. Im Idealfall sollte es sich selbst optimieren, damit es auf verschiedenen Computern optimal funktioniert (z. B. wenn mehr Anforderungen ausgegeben werden)RAID und / oderNCQ verfügbar ist, etc.). Ich denke nicht, dass es daran liegen könnte, die HW-Konfiguration herauszufinden, sondern dass die Verarbeitungsgeschwindigkeit gemessen und die Optimierung darauf basierend erfolgen sollteirgendwie möglich sein. Irgendeine Idee?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage