6

こんにちは、パッケージを使用してRddplyのライブラリで使用しようとしています。計算を高速化していないようです。これは私が実行するコードです: plyrMC

require(doMC)
registerDoMC(4)
getDoParWorkers()
##> 4
test <- data.frame(x=1:10000, y=rep(c(1:20), 500))
system.time(ddply(test, "y", mean))
  # user  system elapsed 
  # 0.015   0.000   0.015
system.time(ddply(test, "y", mean, .parallel=TRUE))
  # user  system elapsed 
  # 223.062   2.825   1.093 

何か案は?

4

2 に答える 2

10

このmean関数は、分割されたセクションを各コアに配布して結果を取得するために必要な通信コストに比べて、動作が速すぎます。

これは、分散コンピューティングで遭遇する一般的な「問題」です。コスト (ノード間の通信) と利点 (複数のコアを使用) があることを忘れているため、すべてが高速化されることを期待しています。

plyr での並列処理に固有のもの: 関数のみが複数のコアで実行されます。分割と結合は依然として単一のコアで行われるため、適用する関数は、plyr 関数を並列で使用する場合の利点を確認するには、非常に計算量が多い必要があります。

于 2012-03-21T16:19:43.253 に答える
1

ジョシュアの答えに続き、この操作を早めたい場合は修正があります。これは Map-reduce のイデオロギーに触発されており、サンプル データセットで POC を行ったことがあります。

Snowfall ライブラリを使用しました。doMC でも作業できると思います。

# On my phone, please pardon typos/bugs

test <- data.frame(x=1:1000000, y=rep(c(1:20), 500))

testList = list()
testList[[1]] <- test[c(1:250000),]
testList[[2]] <- test[c(250001:500000),]
testList[[3]] <- test[c(500001:750000),]
testList[[4]] <- test[c(750001:1000000),]

# Write a function for the above - Need to find optimum number of splits

sfInit(parallel = TRUE, cpus=4)
sfCluster(plyr)
meanList = sfClusterSpplyLB(testList, function(x) ddply(test, "y", mean))

sfStop()

aggregate(meanList, by=list(y), FUN=mean)

これは、分散された方法で分割結合ルーチンを実行していることを考えると、あなたを助けるかもしれません. これは、分割のサイズが同じ場合に機能し、合計、最小/最大、カウントなどで機能しますが、これを使用できない操作がいくつかあります。

于 2013-03-08T07:17:35.647 に答える