Эмуляция scala ParStream

Не редкость в задачах проекта Эйлера, похоже, эквивалентна:

Stream.from(1).map(f).takeWhile((_>0)).foldLeft(0L)(_+_)

где f - некоторая дорогостоящая в вычислении функция который возвращает положительные значения до некоторой неизвестной точки и после этого возвращает нули.

Мне нравится распараллеливать вещи, особенно когда параллельные коллекции Scala и .par делают это так просто. Но в отсутствие ParStream лучшее, что я придумал, это:

val BATCH=1024
Stream.from(1,BATCH).flatMap(
  i=>(i until i+BATCH).par.map(f)
).takeWhile((_>0)).foldLeft(0L)(_+_)

, который не выглядит очень элегантным и чувствителен к выбору значения BATCH (но может дать увеличение скорости в 4 раза). на моем четырехъядернике).

Есть ли предложения по более чистым способам достижения того же результата?

5
задан Zero Piraeus 22 January 2015 в 18:27
поделиться