私は大規模なデータセットに取り組んでおり、モデルを構築した後、次のようにマルチスレッド (Java のプロジェクト全体) を使用します。
OutputStream out = new BufferedOutputStream(new FileOutputStream(outFile));
int i=0;
Collection<Track1Callable> callables = new ArrayList<Track1Callable>();
// For each entry in the test file, do watever needs to be done.
// Track1Callable actually processes that entry and returns a double value.
for (Pair<PreferenceArray, long[]> tests : new DataFileIterable(
KDDCupDataModel.getTestFile(dataFileDirectory))) {
PreferenceArray userTest = tests.getFirst();
callables.add(new Track1Callable(recommender, userTest));
i++;
}
ExecutorService executor = Executors.newFixedThreadPool(cores); //24 cores
List<Future<byte[]>> results = executor.invokeAll(callables);
executor.shutdown();
for (Future<byte[]> result : results) {
for (byte estimate : result.get()) {
out.write(estimate);
}
}
out.flush();
out.close();
各 callable から結果を受け取ったら、それをファイルに出力します。これは、最初の Callables のリストが作成された順序どおりに出力されますか? 他の人より先に完了したにもかかわらず?するべきだと思われますが、確かではありません。
また、合計 620 万バイトが出力ファイルに書き込まれると予想しています。しかし、追加の 2000 バイトを取得します (無料です)。それは私の提出を台無しにします、そしてそれはいくつかの並行性の問題によるものだと思います。これを小さなデータセットでテストしたところ、問題なく動作しているようです (264 バイトが期待され、受信されました)。
Executor フレームワークまたは Futures で何か問題がありますか?