読者です 読者をやめる 読者になる 読者になる

Parallel.js雑感

javascript parallel mapreduce

Parallel.jsという、JS (browserでもnodeでも!)でマルチコア並列処理をするためのライブラリが公開されたのでさくっと紹介(2月10日に最初のcommitみたいです)

READMEを読むと「せっかく web worker こなれてきたからもっと十分に使えるようにしようぜ!」ってことで作られたぽいです。

.spawn()というnodeではあるメソッドや、並列処理を実現する .mapreduce() が使えます。

これまた README.md にありますが、日本語で共有!

@kyo_agoが

って言っててきっとやってくれると思う。

追記:

やってくれないようです \(^o^)/

というわけで利用するときにはunderscore.jsが必須です。

概要

workerを生成し、マルチコアで処理できるよ!ってのが売りのライブラリです。 コア数分だけ立ち上げるのがオヌヌメです!

結果

intergerを3乗してその数だけObjectを生成する処理を作って、reduceしてみた。

処理する関数

var heavy = function(n){
  var nn = n * n * n;
  while(nn-- > 0){
    new Object();
  }
  return nn;
};

use Parallel

var d = Parallel.mapreduce(heavy, add, data);
d.fetch(function (result) {
  console.log(result);
});

f:id:muddydixon:20130227011036j:plain

not use Parallel

console.log(data.map(heavy).reduce(add, 0));

f:id:muddydixon:20130227011042j:plain

僕の環境 (Mac OSX 10.7.5) の safariでは「う、、、う〜〜ん」となりました。 なんでだろう、僕の予想ですは方っぽのCPUが振りきれて方っぽが沈黙の予定だったんだけど...

.spanw() メソッド

<script src="underscore.js"></script>
<script src="parallel.js"></script>

これで Parallelというグローバル変数にされれるので、

// まあ、どうでもいいけど、Math.sqrtする関数を用意
var sqrt = function (n) { return Math.sqrt(n); };

// 返って来るのは`RemoteReference`のインスタンスです。
var r = Parallel.spawn(sqrt, 100);
 
// 値を取り出します。
r.fetch(function (result) {
    console.log(result);
});

APIにもありますが、r.fetch()ってすると、既に計算が終わっている時には結果が返ってきますが、そうでないときにはundefinedが返って来るので、コールバック関数を指定するのがいいと思います。

.mapreduce() メソッド

// 同じくデータを分散処理する関数 (mapper)
var sqrt = function (n) { return Math.sqrt(n); };
 
// 分散して処理された結果をまとめる関数 (reducer)
var add = function (a, b) { return a + b; };
 
// 呼び出すよー
var d = Parallel.mapreduce(sqrt, add, [100, 200, 400, 600, 800]);
 
// データを取り出します。これはspawnと同じ挙動
d.fetch(function (result) {
    console.log(result);
});

.require() メソッド

文字列とか関数を渡して、状態の共有とかライブラリのロードとかができる まあ、あると便利ですよね。ただ、関数とかはJSON.stringifyで文字列にコンバートするのでクラスとかはダメです。

日本語

とりあえず、README.mdだけ日本語にしておいたので、いろいろ試してみたいと思います。 これ、web workerと他のブラウザとかサーバとかをシームレスにやれたらmaprejuiceっぽくて夢が広がる感じです

github