Эмуляция скалы ParStream - PullRequest
       7

Эмуляция скалы ParStream

5 голосов
/ 04 января 2012

Необычный шаблон в задачах Project Euler выглядит примерно так:

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 (но может привести к четырехкратному улучшению скорости моего четырехъядерного процессора).

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

1 Ответ

5 голосов
/ 04 января 2012

Ну, вы можете сделать его немного более элегантным, например, Stream from 1 grouped BATCH map (_.par), хотя я бы предпочел использовать Iterator в этом случае - гораздо легче, чем Stream, и он не будет заполнять REPL.память, как я экспериментирую с ней.

...