2

標準偏差を見つけるのに似た機能を実行していますが、実行に時間がかかります。

標準偏差の累積値を計算する関数、つまり 1 日目から n 日目までの標準偏差タイプの関数を使用する予定です。

ただし、計算に時間がかかるため、これをクラスターで実行したいと考えました。

そのため、クラスターの各ノードがほぼ同時に終了するように、データを分割したかったのです。たとえば、私の機能が次のようなものである場合、単一マシンの方法は次のように機能します。

vec <- xts(rnorm(1000),Sys.Date()-(1:1000)
lapply(1:length(vec), function(x){
    Sys.sleep(30)
    sd(as.numeric(vec[1:x]))
}

(NB sys.sleep は、カスタム関数の処理にかかる余分な時間を表すためにそこに追加されます)

ただし、これを 1 台ではなく 2 台のマシンに分割したいとしましょう。各マシンにマシン 1 とマシン 21:length(vec)のリストを与えて 、両方のマシンが時間どおりに終了するように、ベクトルを分割するにはどうすればよいでしょうか。つまり、両方のプロセスがほぼ同時に完了するような y の値はどうなるでしょうか...そして、10 台のマシンでそれを行うとしたらどうなるでしょうか...そのための元のベクトルのブレークを見つけるにはどうすればよいでしょうか?働くために...c(1:y)c((y+1):length(vec))c(1:length(vec))

つまり、私は持っているだろう

y <- 750 # This is just a guess as to potentially where it might be.
vec <- xts(rnorm(1000),Sys.Date()-(1:1000)
# on machine 1 I would have
lapply(1:y, function(x){
    Sys.sleep(30)
    sd(as.numeric(vec[1:x]))
}

# and on machine 2 I would have

lapply(y+1:length(vec), function(x){
    Sys.sleep(30)
    sd(as.numeric(vec[1:x]))
}
4

3 に答える 3

6

パラレルパッケージはベースRの一部になり、AmazonEC2を含む中規模のクラスターでRを実行するのに役立ちます。関数parLapplyLBは、入力ベクトルからクラスターのワーカーノードに作業を分散します。

知っておくべきことの1つは、makePSOCKclusterが(現在R 2.15.2の時点で)connections.cのNCONNECTIONS定数によって128ワーカーに制限されていることです。

自分のマシンで試すことができる並列パッケージを使用したセッションの簡単な例を次に示します。

library(parallel)
help(package=parallel)

## create the cluster passing an IP address for
## the head node
## hostname -i works on Linux, but not on BSD
## descendants (like OS X)
# cl <- makePSOCKcluster(hosts, master=system("hostname -i", intern=TRUE))

## for testing, start a cluster on your local machine
cl <- makePSOCKcluster(rep("localhost", 3))

## do something once on each worker
ans <- clusterEvalQ(cl, { mean(rnorm(1000)) })

## push data to the workers
myBigData <- rnorm(10000)
moreData <- c("foo", "bar", "blabber")
clusterExport(cl, c('myBigData', 'moreData'))

## test a time consuming job
## (~30 seconds on a 4 core machine)
system.time(ans <- parLapplyLB(cl, 1:100, function(i) {
  ## summarize a bunch of random sample means
  summary(
    sapply(1:runif(1, 100, 2000),
           function(j) { mean(rnorm(10000)) }))
}))

## shut down worker processes
stopCluster(cl)

Bioconductorグループは、開始するための非常に簡単な方法を設定しました。クラウドで並列クラスターを使用する

EC2での並列パッケージの使用の詳細については、「クラウドでのR」および一般的なクラスターでのRについては、「CRANタスクビュー:Rを使用した高性能および並列コンピューティング」を参照してください。

最後に、Rの外部で確立されたもう1つのオプションは、Starclusterです。

于 2012-12-11T05:14:05.010 に答える
2

snowパッケージを見てください。具体的にはclusterApplyLB、負荷分散された適用関数を処理する関数です。

これにより、ノード/コアへの作業の分散が、単なる均等なパーティションよりもインテリジェントに処理されます。

于 2012-12-11T04:43:11.283 に答える
1

RHIPE経由で Hadoop (別名 MapReduce) を使用することを検討してください。

于 2012-12-11T04:44:15.000 に答える