6

Macでddplyを並行して実行しようとしています。私が使用したコードは次のとおりです。

library(doMC)
library(ggplot2) # for the purposes of getting the baseball data.frame
registerDoMC(2)


> system.time(ddply(baseball, .(year), numcolwise(mean)))
   user  system elapsed 
  0.959   0.106   1.522 
> system.time(ddply(baseball, .(year), numcolwise(mean), .parallel=TRUE))
   user  system elapsed 
  2.221   2.790   2.552 

.parallel = TRUEを実行すると、ddplyが遅くなるのはなぜですか?私は無駄にオンラインで検索しました。私も試しましregisterDoMC()たが、結果は同じでした。

4

2 に答える 2

11

baseballデータが小さすぎて、計算を並列化しても改善が見られない場合があります。さまざまなプロセスにデータを渡すオーバーヘッドは、計算を並行して実行することにより、スピードアップを圧倒する可能性があります。rbenchmarkパッケージの使用:

baseball10 <- baseball[rep(seq(length=nrow(baseball)), 10),]

benchmark(noparallel = ddply(baseball, .(year), numcolwise(mean)),
    parallel = ddply(baseball, .(year), numcolwise(mean), .parallel=TRUE),
    noparallel10 = ddply(baseball10, .(year), numcolwise(mean)),
    parallel10 = ddply(baseball10, .(year), numcolwise(mean), .parallel=TRUE),
    replications = 10)

結果を出す

          test replications elapsed relative user.self sys.self user.child sys.child
1   noparallel           10   4.562 1.000000     4.145    0.408      0.000     0.000
3 noparallel10           10  14.134 3.098203     9.815    4.242      0.000     0.000
2     parallel           10  11.927 2.614423     2.394    1.107      4.836     6.891
4   parallel10           10  18.406 4.034634     4.045    2.580     10.210     9.769

データセットが10倍大きい場合、並列処理のペナルティは小さくなります。より複雑な計算は、並列に有利にそれをさらに傾け、おそらくそれに利点を与えます。

これは、Mac OS X 10.5.8 Core2Duoマシンで実行されました。

于 2011-08-24T19:30:46.867 に答える
9

ノード間の通信コストが関数の計算時間よりも大きい場合、並列実行は順次実行よりも遅くなります。つまり、計算を実行するよりも、ノードとの間でデータを送受信するのに時間がかかります。

同じデータセットの場合、通信コストはほぼ固定されているため、関数の評価にかかる時間が長くなると、並列処理の方が便利になります。

更新:
以下のコードは、(私のマシンでは)0.14秒が評価に費やされていることを示しています.fun。つまり、通信は0.07秒未満である必要があり、サイズがのデータセットでは現実的ではありませんbaseball

Rprof()
system.time(ddply(baseball, .(year), numcolwise(mean)))
#    user  system elapsed 
#    0.28    0.02    0.30
Rprof(NULL)
summaryRprof()$by.self
#               self.time self.pct total.time total.pct
# [.data.frame       0.04    12.50       0.10     31.25
# unlist             0.04    12.50       0.10     31.25
# match              0.04    12.50       0.04     12.50
# .fun               0.02     6.25       0.14     43.75
# structure          0.02     6.25       0.12     37.50
# [[                 0.02     6.25       0.08     25.00
# FUN                0.02     6.25       0.06     18.75
# rbind.fill         0.02     6.25       0.06     18.75
# anyDuplicated      0.02     6.25       0.02      6.25
# gc                 0.02     6.25       0.02      6.25
# is.array           0.02     6.25       0.02      6.25
# list               0.02     6.25       0.02      6.25
# mean.default       0.02     6.25       0.02      6.25

これが雪との並列バージョンです:

library(doSNOW)
cl <- makeSOCKcluster(2)
registerDoSNOW(cl)

Rprof()
system.time(ddply(baseball, .(year), numcolwise(mean), .parallel=TRUE))
#    user  system elapsed 
#    0.46    0.01    0.73
Rprof(NULL)
summaryRprof()$by.self
#                     self.time self.pct total.time total.pct
# .Call                    0.24    33.33       0.24     33.33
# socketSelect             0.16    22.22       0.16     22.22
# lazyLoadDBfetch          0.08    11.11       0.08     11.11
# accumulate.iforeach      0.04     5.56       0.06      8.33
# rbind.fill               0.04     5.56       0.06      8.33
# structure                0.04     5.56       0.04      5.56
# <Anonymous>              0.02     2.78       0.54     75.00
# lapply                   0.02     2.78       0.04      5.56
# constantFoldEnv          0.02     2.78       0.02      2.78
# gc                       0.02     2.78       0.02      2.78
# stopifnot                0.02     2.78       0.02      2.78
# summary.connection       0.02     2.78       0.02      2.78
于 2011-08-24T19:08:58.147 に答える