【发布时间】:2011-04-06 00:16:24
【问题描述】:
我正在处理一个大型数据集,在构建模型后,我使用多线程(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 上做错了什么?
【问题讨论】:
-
应该没什么区别,但是你可以写一个
byte[]而不用遍历它的所有字节:out.write(result.get(), 0, result.get().length)。 -
如果您之前知道每个结果的大小(例如,如果它始终相同),您可以添加一个测试来检查。只是为了确保您的其他代码返回大小错误的结果没有问题。
标签: java multithreading executorservice callable