我有一塊程序處理大量文件,其中對於每個文件需要做兩件事:首先,讀取和處理一些文件,然後得到的MyFileData
得到存儲。第一部分可以並行化,第二部分不可以。優化許多文件的並行處理
順序做一切是很慢的,因爲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());
它有很大幫助。不過,我希望能夠提升兩件事情:
的
sequentialOperation
被固定的順序,而不是處理任何結果,請首先執行。我該如何改變它?有成千上萬的文件需要處理,並且啓動數千個磁盤請求可能會導致磁盤被毀壞。通過使用
Executors.newFixedThreadPool(10)
我限制了這個數字,但是我正在尋找更好的東西。理想情況下,它應該是自我調整,以便它在不同的計算機上工作最佳(例如,當可用RAID和/或NCQ等時,發出更多請求)。我不認爲它可以基於找出硬件配置,但測量處理速度和基於它的優化應該不知何故是可能的。任何想法?
誰從未做過一個快速出樣,我相信「CHII」有答案是:按原樣繼續並行操作,但將這些結果放入磁盤寫入的隊列(對於磁盤IO的串行性質更適合)。 – BonanzaDriver 2012-07-20 14:19:06