Otimizando o processamento paralelo de muitos arquivos

Eu tenho um programa processando muitos arquivos, onde para cada arquivo duas coisas precisam ser feitas: Primeiro, alguma parte do arquivo é lida e processada, e então o resultadoMyFileData fica armazenado. A primeira parte pode ser paralelizada, a segunda não pode.

Fazer tudo sequencialmente é muito lento, já que a CPU tem que esperar pelo disco, então funciona um pouco, e então ele emite outra requisição, e aguarda novamente ...

Eu fiz o seguinte

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

e isso ajudou muito. No entanto, gostaria de melhorar duas coisas:

osequentialOperation é executado em uma ordem fixa em vez de processar qualquer resultado que esteja disponível primeiro. Como posso mudá-lo?

Há milhares de arquivos a serem processados ​​e a inicialização de milhares de solicitações de disco pode levar à eliminação de lixo no disco. UsandoExecutors.newFixedThreadPool(10) Eu limitei esse número, mas estou procurando algo melhor. Idealmente, deve ser auto-ajustável, para que funcione de forma ideal em diferentes computadores (por exemplo, emite mais solicitações quandoRAID e / ouNCQ está disponível, etc.). Eu não acho que poderia ser baseado em descobrir a configuração HW, mas medir a velocidade de processamento e otimizar com base nela deveriade alguma forma seja possível. Qualquer ideia?

questionAnswers(2)

yourAnswerToTheQuestion