Screaming Loud

日々是精進

ScalaBlitzの使い方

ScalaBlitzの使い方をめちゃくちゃ簡単にまとめてみました。

ScalaBlitzとはなんなのか?

ユーザが何も気にすることなく、並列化を行えるライブラリ、それがScalaBlitzである。

なんで作った?

Scala2.9で並列コレクションがリリースされた。
ネイティブに並列化ライブラリがあるのになぜScalaBlitzを作ったのか?
それは、「一般的なライブラリベースアプローチを取ったため、抽象的な部分があり、ボクシングなどのオーバーヘッドがあり、線形代数などに適していない。」
また、「タスクベースのプリエンプティブなスケジュールは、一部のイレギュラーなものは扱えない。」
などの理由から、オーバーヘッドをなくしたのがScalaBlitzということだそう。

実際の使いかた

import scala.collection.par._import scala.collection.par.Scheduler.Implicits.global

こんな感じに、コレクションにtoParをつけるだけ。

def mean(a: Array[Float]): Float = {
  val sum = a.toPar.reduce(_ + _)
  sum / a.length
}

めちゃくちゃ簡単!

使えるコレクション

  1. Array
  2. Range
  3. Mutable.HashMap
  4. Mutable.HashSet
  5. immutable.HashMap
  6. immutable.HashSet
  7. immutable.TreeSet
  8. immutable.Conc

返り値

返り値に関しても、値でもコレクションでもどちらでも返せる。
値返却の場合は、先ほどの平均を求めるようなコードに。

コレクションを返却する場合は、以下のような感じ

def even(array: Array[Int]): Array[Int] = array.toPar.filter(_ % 2 == 0).seq

使うときの注意

副作用に注意!
forループは使って値の更新を使うのはやめたほうがいい。
(要はvarを使うな!)
じゃあ何を使うべきか?そうreduceだ!

あと気をつけるべきは、
冪等性を守る
メモリのボトルネックを起こさせない
ボクシングさせない


公式ドキュメントのGettingStartを簡単にまとめてみただけなので、
詳しくは、公式をどうぞ。
Getting started | ScalaBlitz