Scala中的并行迭代器

zig*_*tar 14 parallel-processing scala scala-collections

是否有可能,使用Scala的并行集合来并行化并且事先Iterator 没有完全评估它?

这里我谈论的是并行化函数转换Iterator,即mapflatMap.我认为这需要Iterator提前评估一些元素,然后计算更多,一旦消耗了一些元素next.

我所能找到的只需要将迭代器转换为a Iterable或者Stream最多.在Stream当我打电话,然后得到完全评估.par就可以了.

如果没有现成的建议,我也欢迎实施建议.实现应该支持并行mapflatMap.

ms-*_*-tg 6

我知道这是一个老问题,但在ParIterator在执行迭代器库做你要找的东西?

scala> import com.timgroup.iterata.ParIterator.Implicits._
scala> val it = (1 to 100000).toIterator.par().map(n => (n + 1, Thread.currentThread.getId))
scala> it.map(_._2).toSet.size
res2: Int = 8 // addition was distributed over 8 threads
Run Code Online (Sandbox Code Playgroud)


Rex*_*err 4

使用标准库的最佳选择可能不是使用并行集合,而是concurrent.Future.traverse

import concurrent._
import ExecutionContext.Implicits.global
Future.traverse(Iterator(1,2,3))(i => Future{ i*i })
Run Code Online (Sandbox Code Playgroud)

尽管我认为这将尽快开始执行整个事情。