私はたくさんのファイルを処理するプログラムを持っています。各ファイルに対して2つのことを行う必要があります。最初にファイルの一部を読み取って処理し、次に結果MyFileData
を保存します。最初の部分は並列化できますが、2番目の部分は並列化できません。
CPUはディスクを待機する必要があるため、すべてを順番に実行すると非常に遅くなります。その後、少し動作し、別の要求を発行して、再度待機します...
私は次のことをしました
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());
そしてそれは大いに役立ちました。ただし、次の2つを改善したいと思います。
は
sequentialOperation
、最初に利用可能な結果を処理するのではなく、固定された順序で実行されます。どうすれば変更できますか?処理するファイルは数千あり、数千のディスク要求を開始するとディスクのゴミ箱につながる可能性があります。使用する
Executors.newFixedThreadPool(10)
ことでこの数を制限しましたが、もっと良いものを探しています。理想的には、セルフチューニングである必要があります。これにより、さまざまなコンピューターで最適に動作します(たとえば、RAIDやNCQが使用可能な場合に、より多くの要求を発行します)。ハードウェアの構成を知ることに基づくものではないと思いますが、処理速度を測定し、それに基づいて最適化することは、どういうわけか可能であるはずです。何か案が?