« Rで株価データを取得 | Home | MicroArray Challenge ヒント3が出てます »

Rで並列処理 (snowライブラリ)

By kmgs | 11 月 28, 2008

snowライブラリ(開発者webサイトRjpWiki)を用いることでRで並列処理を行うことができるのですが、以前から仕事(Linuxクラスター上でのマイクロアレイデータの統計処理等)ではガンガン使っています。
半年ほど前に確認したときには、snowライブラリはWindowsに対応していなかったのですが、いつのまにか対応したようです。最近ではマルチコアCPUが普及しているため、やや重めの繰り返し処理を手元のPCでサクッと行いたい場合には便利だと思います。
インストールは

> install.packages("snow")

で素直に行えるはずです。今回はMPIやPVMまで深入りせず、R単品で動作するSOCKモードをWindows環境で試してみます。

> library(snow)
> cl <- makeSOCKcluster(c("localhost", "localhost"))

これで、localhostに2個のノードを割り当てられます。試しにgetwd()でそれぞれの環境のカレントディレクトリを取得してみます。

> clusterCall(cl, getwd)
[[1]]
[1] "C:/hogehoge"

[[2]]
[1] "C:/hogehoge"

ちょっとしたベンチマーク。1000行100列 (マイクロアレイデータを想定、行が遺伝子、列がサンプル)のデータを作り、各行に対してWelchのt検定を行ってみます。

> mat <- matrix(rnorm(100000), 1000, 100)
> f <- factor(rep(0:1, each=50))
# 各ノードに変数をエクスポートするには、仕様上グローバル変数にする必要がある。
> g <<- f
> clusterExport(cl, "g")
# 単独ノード
> system.time(apply(mat, 1, function(x) t.test(x ~ g)$p.value) -> c1)
   ユーザ   システム       経過  
      3.40       0.01       3.47
# 2ノード 
> system.time(parRapply(cl, mat, function(x) t.test(x ~ g)$p.value) -> c2)
   ユーザ   システム       経過  
      0.05       0.01       2.00 
# もちろん、結果は一致しないと困る
> sum(abs(c1-c2))
[1] 0

実行時間は半分とは行かないまでも、それなりに短縮できるようです。実際のマイクロアレイには2-5万くらいのプローブセットが載っているので、単純に見積もって上記の20-50倍程度の時間が掛かります。また、普段はt検定より格段に処理が遅いWilcoxonの順位和検定(coinライブラリのwilcox_test)を使っているので、途方もなく時間が掛かります。

余談ですが、マイクロアレイデータは行が遺伝子、列がサンプルとなっている場合が非常に多いです(一般的には行がサンプル、列が変数)。まあ、慣れてしまえばなんてことはないのですが。

Topics: R, マイクロアレイ |

Comments

*
画像に書かれた文字を入力してください

スパム対策用画像
ログインすると画像認証なしで投稿できます

ホットワード 並列処理 padding margin 統計 処理
割引クーポンまとめ情報 - クー割