0

scala で、長いリストがあり、各要素に対して独立した操作を行う関数をマップするとします。

val myList = List(....)
def fct(...) = {...}

myList.map(elem => fct(elem))

fct変更不可の操作のみを使用するためval、そのまま簡単に並列化できます

myList.par.map(elem => fct(elem))

for:

for(elem <- myList) {
    fct(elem)
}

私の質問は、リスト内のどのレベルにいるかを示す、コマンド内に一種の進行状況バーを表示する方法です。私は次のようなことを考えました:

var i = o 

ループの前と内側

i += 1
print(i + (" "*100) + "\r") 

しかし、これは並列化の可能性を台無しにします。

4

1 に答える 1

6

1 つの方法は、コレクションのサイズに応じて、アトミックな整数または long を使用して、物事をスレッドセーフにすることです。

def trackProgress[T](fn:T => Unit, xs: collection.parallel.ParSeq[T]) {
  val total = xs.length
  val done = new java.util.concurrent.atomic.AtomicInteger()
  xs.foreach { x =>
    fn(x)
    val curDone = done.incrementAndGet()
    println("%s%% done".format(curDone.floatValue / total * 100))
  }
}

trackProgress(fct, myList.par)
于 2013-08-02T08:58:37.663 に答える