Scala嵌套在Streams上循环

时间:2013-11-24 21:04:17

标签: scala parallel-processing iteration

我编写了以下Scala代码来计算距离矩阵:

def dist(fasta: Stream[FastaRecord], f: (FastaRecord, FastaRecord) => Int) = {
  val inF = fasta.par
  for (i <- inF; j <- inF)
   yield (f(i, j))
}

这个代码在我获得出色并行性的意义上非常有用。不幸的是,我的工作量是我需要的两倍,因为f(i,j)与f(j,i)相同。我想要做的是在流中的i + 1处开始j。我可以用索引来做到这一点:

for (i <- 0 until inF.length - 1; j <- i+1 until inF.length) 
  yield(f(inF(i), inF(j)))

但是,我听说inF.length在流上并不好用,这并没有给我带来并行性。

我认为应该有办法进行这种迭代,但是,我还没有想出任何东西。

谢谢!吉姆

1 个答案:

答案 0 :(得分:1)

我认为使用zipWithIndex可能会为您提供所需内容:

def dist(fasta: Stream[FastaRecord], f: (FastaRecord, FastaRecord) => Int) = {
  val inF = fasta.zipWithIndex.par
  for ((x, i) <- inF; (y, j) <- inF; if i <= j)
   yield f(x, y)
}

通过过滤i <= j,您可以消除重复(镜像)的情况。但是,我在编译时会收到警告:

warning: `withFilter' method does not yet exist on scala.collection.parallel.immutable.ParSeq[(FastaRecord, Int)], using `filter' method instead

我认为这不会是一个问题,但我也不知道如何压制错误......