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?