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 }
めちゃくちゃ簡単!
使えるコレクション
- Array
- Range
- Mutable.HashMap
- Mutable.HashSet
- immutable.HashMap
- immutable.HashSet
- immutable.TreeSet
- immutable.Conc
返り値
返り値に関しても、値でもコレクションでもどちらでも返せる。
値返却の場合は、先ほどの平均を求めるようなコードに。
コレクションを返却する場合は、以下のような感じ
def even(array: Array[Int]): Array[Int] = array.toPar.filter(_ % 2 == 0).seq
使うときの注意
副作用に注意!
forループは使って値の更新を使うのはやめたほうがいい。
(要はvarを使うな!)
じゃあ何を使うべきか?そうreduceだ!
あと気をつけるべきは、
冪等性を守る
メモリのボトルネックを起こさせない
ボクシングさせない
公式ドキュメントのGettingStartを簡単にまとめてみただけなので、
詳しくは、公式をどうぞ。
Getting started | ScalaBlitz