More Related Content
More from Masayuki Isobe (20)
rzmq
- 5. 【1】 同じマシン上でRとRをつなぐ
プロセス1(Rを起動) プロセス2(Rを起動)
library(‘rzmq’)
context = init.context()
sock1 = init.socket(context, “ZMQ_PULL”)
bind.socket(sock1, “ipc:///test”)
receive.socket(sock1)
library(‘rzmq’)
context = init.context()
sock1 = init.socket(context, “ZMQ_PUSH”)
connect.socket(sock1, “ipc:///test”)
send.socket(sock1,“hoge”)
[1] "hoge"
文字列の転送
receive.socket(sock1)
receive.socket(sock1)
x <- 3.14
y <- 1:5
send.socket(socket, x)
send.socket(socket, y)
数値データ
の転送
[1] 3.14
[1] 1 2 3 4 5
なんと関数
の転送も可能
f <- function(n) n*365
send.send(socket, f)
send.send(socket, f)
receive.socket(sock1)
f <- receive.socket(sock1)
f(10)
function(n) n*365
[1] 3650
(参考) 逆方向にデータを送りたいときは、もう一組のPUSH-PULLソケットを作成する
ちゃんと関数を使える
- 6. 【2】 別マシン間でRとRをつなぐ
ホストAのプロセス(Rを起動) ホストBのプロセス(Rを起動)
library(‘rzmq’)
context = init.context()
sock1 = init.socket(context, “ZMQ_PULL”)
bind.socket(sock1, “tcp://*:1234”)
receive.socket(sock1)
library(‘rzmq’)
context = init.context()
sock1 = init.socket(context, “ZMQ_PUSH”)
connect.socket(sock1, “tcp:///192.168.10.1:1234”)
send.socket(sock1,“hoge”)
[1] "hoge"
(参考) 両マシン上のRに同じパッケージが入っていれば、パッケージ関数の呼び出しは可能
ただし送れるのはピュアRのデータだけであり、パッケージの内部(C言語のメモリ)に
持っているデータは送ることができない。
以下、前頁と同様に数値データや関数を送受信できる
違いはここだけ
192.168.10.1 192.168.10.2
ポート1234
- 7. 【3】 Rと他言語をつなぐ
library(‘rzmq’)
library(‘rjson’)
context = init.context()
sock1 = init.socket(context, “ZMQ_PULL”)
sock2 = init.socket(context, “ZMQ_PUSH”)
bind.socket(sock1, “ipc:///test1”)
bind.socket(sock2, “ipc:///test2”)
while(1) {
json<-receive.string(sock1)
dat <- fromJSON(json)
res <- some_calculate(dat)
send.string(sock2, toJSON(res))
}
R
Python
import zmq
import json
context = zmq.Context()
sock1 = context.socket(zmq.PUSH)
sock1.connect(“ipc:///test1”)
sock2 = context.socket(zmq.PULL)
sock2.connect(“ipc:///test2”)
sock1.send(json.dumps([1,2,[3]])
res=json.loads(sock2.recv())
JSONで
やりとり
(用途例)
* WebサービスのバックエンドでRを動かして分析機能を実現
* バッチ集計の一部でデータマイニングのところをRで実行
* Rから、前処理の部分をPerlやPythonで行う
* Rとscipyやscikit-learnを連携
* zeromqのfluent-plugin を使って、Rからfluentdでログデータを転送
(ちなみにJSONじゃなくてMsgPackで通信する方法があるか試したがうまくいかなかった)
var zmq = require(‘zmq’)
, sock1 = zmq.socket(‘push’)
, sock2 = zmq.socket(‘pull’);
sock1 = context.socket(zmq.PUSH);
sock1.connect(“ipc:///test1”);
sock2 = context.socket(zmq.PULL);
sock2.connect(“ipc:///test2”);
sock1.send(JSON.stringify([1,2,[3]]));
sock2.on(‘message’, function(msg) {
res = JSON.parse(msg);
});
Node.js
Perl
Ruby
以下、なんでも
- 8. 【4】 AWSでスピードテストやってみた
スタンドアロン
(Rのプロセス1個)
一様乱数でx*x+y*y < 1 な割合でπ/4を求める
→ 4倍してπを得る
よくあるやつ
○ 実験の設定
・乱数の数N = 100000000 (1億)
・スタンドアロンのプログラムと、マスタスレーブ型の構成で速度を比較
・8コア26ECUのAWS EC2 M3ダブルエクストララージインスタンスで検証
・スレーブはN/10000(1万)単位のタスクを割り振る
スレーブ
(Rのプロセス)
マスター
(Rのプロセス)
https://gist.github.com/chiral/5689735
実験に使ったソースコード
比較