tim*_*day 5 parallel-processing scala scala-collections
Project Euler问题中一个并不罕见的模式似乎相当于:
Stream.from(1).map(f).takeWhile((_>0)).foldLeft(0L)(_+_)
Run Code Online (Sandbox Code Playgroud)
其中f是一些昂贵的计算函数,它将正值返回到某个未知点,然后返回零.
我喜欢并行化的东西,特别是当Scala的并行集合并且.par让它变得如此简单时.但是在没有ParStream的情况下,我提出的最好的是:
val BATCH=1024
Stream.from(1,BATCH).flatMap(
i=>(i until i+BATCH).par.map(f)
).takeWhile((_>0)).foldLeft(0L)(_+_)
Run Code Online (Sandbox Code Playgroud)
它看起来不是很优雅,而且对BATCH价值的选择很敏感(但是我的四核可以提高x4的速度).
有关更清洁的方法获得相同结果的任何建议吗?
好吧,你可以用类似的东西使它变得更优雅Stream from 1 grouped BATCH map (_.par),虽然我宁愿Iterator在这种情况下使用- 比重量轻得多Stream,并且当我试验它时它不会填满REPL的记忆.