Optimizando el procesamiento paralelo de muchos archivos.

Tengo una parte del programa que procesa una gran cantidad de archivos, donde para cada una de ellas se deben hacer dos cosas: primero, se lee y se procesa una parte del archivo, y luego el resultadoMyFileData se almacena. La primera parte puede ser paralelizada, la segunda no puede.

Hacer todo secuencialmente es muy lento, ya que la CPU tiene que esperar por el disco, luego funciona un poco, luego emite otra solicitud y espera de nuevo ...

Hice lo siguiente

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

y ayudó mucho. Sin embargo, me gustaría mejorar dos cosas:

lossequentialOperation se ejecuta en una orden fija en lugar de procesar primero el resultado disponible. ¿Cómo puedo cambiarlo?

Hay miles de archivos para procesar y el inicio de miles de solicitudes de disco podría llevar a la eliminación del disco. Mediante el usoExecutors.newFixedThreadPool(10) He limitado este número, sin embargo estoy buscando algo mejor. Lo ideal es que se ajuste automáticamente, de modo que funcione de manera óptima en diferentes computadoras (por ejemplo, emite más solicitudes cuandoRAID y / oNCQ está disponible, etc.). No creo que se pueda basar en averiguar la configuración de HW, pero la medición de la velocidad de procesamiento y la optimización basada en ella deberíande algun modo ser posible. ¿Alguna idea?

Respuestas a la pregunta(2)

Su respuesta a la pregunta