Я работаю с крупномасштабным набором данных, и после построения модели я использую многопоточность (весь проект на 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? Несмотря на то, что некоторые заканчивают раньше других? Кажется, это должно быть, но не уверен.
Кроме того, я ожидаю, что в файл будет записано 6,2 миллиона байт. Но я получаю дополнительные 2000 байтов (да бесплатно). Это портит мое представление, и я думаю, что это из-за некоторых проблем параллелизма. Я проверил это на небольшом наборе данных, и, похоже, он отлично работает (ожидается и получено 264 байта).
Что-то не так, что я делаю с платформой Executor или Futures?