【问题标题】:Emulating a scala ParStream模拟 Scala ParStream
【发布时间】:2012-02-01 22:33:58
【问题描述】:

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 值的选择很敏感(但可以在我的四核上产生 x4 的速度提升)。

对于实现相同结果的更清洁方法有什么建议吗?

【问题讨论】:

  • 你给出的例子不等价:例如val f = 15 - (_: Int)BATCH = 10第一个给出105,第二个给出95
  • @Luigi:这就是为什么我用“返回正值直到...并在此之后返回零”来限定它。例如,它适用于 def f(x) = 0 max (15-x)。

标签: scala parallel-processing scala-collections


【解决方案1】:

好吧,你可以用Stream from 1 grouped BATCH map (_.par) 之类的东西让它更优雅一点,尽管在这种情况下我宁愿使用Iterator——比Stream 轻得多,而且它不会填满REPL记忆,因为我试验它。

【讨论】:

  • 谢谢;我之前什至没有注意到分组方法!
猜你喜欢
  • 2011-04-04
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多