Optymalizacja przetwarzania równoległego wielu plików

Mam fragment programu przetwarzający wiele plików, gdzie dla każdego pliku należy zrobić dwie rzeczy: Po pierwsze, fragment pliku jest odczytywany i przetwarzany, a następnie wynikowyMyFileData zostaje zapisany. Pierwsza część może być równoległa, druga nie.

Wykonywanie wszystkiego sekwencyjnie jest bardzo powolne, ponieważ procesor musi czekać na dysk, a następnie działa trochę, a następnie wysyła kolejne żądanie i ponownie czeka ...

Zrobiłem co następuje

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());

i to bardzo pomogło. Chciałbym jednak poprawić dwie rzeczy:

ThesequentialOperation zostaje wykonana w ustalonej kolejności, zamiast przetwarzać wynik, który jest dostępny jako pierwszy. Jak mogę to zmienić?

Są tysiące plików do przetworzenia, a uruchomienie tysięcy żądań na dysku może doprowadzić do koszenia dysku. UżywającExecutors.newFixedThreadPool(10) Ograniczyłem ten numer, ale szukam czegoś lepszego. Idealnie powinno być samodostrajanie, aby działało optymalnie na różnych komputerach (np. Wysyła więcej żądań, gdyNALOT i / lubNCQ jest dostępny itp.). Nie sądzę, aby mogło to opierać się na ustaleniu konfiguracji HW, ale pomiar prędkości przetwarzania i optymalizacja na podstawie tego powinnyjakoś dać. Dowolny pomysł?

questionAnswers(2)

yourAnswerToTheQuestion