我正在处理大型数据集,在构建模型后,我使用多线程(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();
当我收到每个可调用的结果时,将其输出到文件中。此输出是否与初始 Callables 列表的生成顺序完全相同?尽管有些人先于其他人完成?似乎应该但不确定。
此外,我预计总共有 620 万字节将写入输出文件。但我得到了额外的 2000 字节(是的,免费)。这弄乱了我的提交,我认为这是因为一些并发问题。我在小型数据集上对此进行了测试,它似乎在那里工作正常(预期和接收到 264 个字节)。
我在 Executor 框架或 Futures 上做错了什么?