我编写了以下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在流上并不好用,这并没有给我带来并行性。
我认为应该有办法进行这种迭代,但是,我还没有想出任何东西。
谢谢!吉姆
答案 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
我认为这不会是一个问题,但我也不知道如何压制错误......