3

これは、前の質問mclapplyとプロット用のforループに関連しています。速度とスケーラビリティの焦点です。同じことを行う方法は3つまたは4つあると思いますが、ランダムシードを設定しても異なる結果が得られます。

まず...結果が異なるのはなぜですか...

事実上同じことをしていますresults2か?results3

最初の例には示されていませんが(以下に示されています)....parrallel = TRUEオプションを使用しない場合よりもresults2に時間がかかる場合がありますが、それはなぜですか?

> rm(list=ls())
> gc()
         used (Mb) gc trigger  (Mb) max used  (Mb)
Ncells 253264 13.6    1801024  96.2  1643320  87.8
Vcells 829208  6.4   22407472 171.0 28009341 213.7
> require(ggplot2)
Loading required package: ggplot2
> require(plyr)
Loading required package: plyr
> require(foreach)
Loading required package: foreach
foreach: simple, scalable parallel programming from Revolution Analytics
Use Revolution R for scalability, fault tolerance and more.
http://www.revolutionanalytics.com
> require(doMC)
Loading required package: doMC   
Loading required package: iterators
Loading required package: multicore
> registerDoMC(cores=4)
> gc()
          used (Mb) gc trigger  (Mb) max used  (Mb)
Ncells  409261 21.9    1440819  77.0  1643320  87.8
Vcells 1039134  8.0   17925977 136.8 28009341 213.7
> df <- expand.grid(i = 1:100, j = 1:2 , k = seq(100, 500, 100))
> params <- mapply(list, n = df[, 3], mu = df[, 1], stdev = df[,2], SIMPLIFY = F)
> ff <- function(tlist) {
+     set.seed(123)
+     n <- tlist$n
+     mu <- tlist$mu
+     stdev <- tlist$stdev
+     x1 <- c(1:n)
+     y1 <- rnorm(n,mu,stdev)
+     z1 <- data.frame(cbind(x1,y1))
+     ggplot(z1, aes(x=x1,y=y1))+
+         geom_point()+
+         labs(title=paste("n=",n,"mu=",mu, "stdev=",stdev))
+ }
> system.time(results <- llply(params, ff))
   user  system elapsed 
  5.363   0.009   5.368 
> system.time(results2 <- llply(params, ff,.parallel=TRUE))
   user  system elapsed 
  2.689   0.259   2.938 
> system.time(results3 <- mclapply(params, ff, mc.cores = 4, mc.preschedule = TRUE))
   user  system elapsed 
  7.488   0.685   2.501 
> identical(results,results2)
[1] FALSE
> identical(results,results3)
[1] FALSE
> identical(results2,results3)
[1] FALSE

比較:

require(rbenchmark)
benchmark(results <- llply(params, ff),
          results2 <- llply(params, ff,.parallel=TRUE), 
           results3 <- mclapply(params, ff, mc.cores = 4, mc.preschedule = TRUE),
             replications=5 )

次の結果が得られます。

                                                                    test replications elapsed relative user.self sys.self user.child sys.child
 1                                          results <- llply(params, ff)            5  27.869    1.521    27.833    0.043      0.000     0.000
 2                       results2 <- llply(params, ff, .parallel = TRUE)            5 109.990    6.003     5.455    2.472     37.565     7.048
 3 results3 <- mclapply(params, ff, mc.cores = 4, mc.preschedule = TRUE)            5  18.322    1.000     1.582    1.545     42.730    10.441

そして、5回だけではなく10回の複製を行うと、さらに奇妙なことになります。

 benchmark(results <- llply(params, ff),
      results2 <- llply(params, ff,.parallel=TRUE), 
      results3 <- mclapply(params, ff, mc.cores = 4, mc.preschedule = TRUE),
       replications=10 )

あなたはこれを手に入れます:

                                                                     test replications elapsed relative user.self sys.self user.child sys.child
  1                                          results <- llply(params, ff)           10  55.031    1.000    54.641    0.144      0.000     0.000
  2                       results2 <- llply(params, ff, .parallel = TRUE)           10 107.801    1.959     9.877    6.045     80.022    23.062
  3 results3 <- mclapply(params, ff, mc.cores = 4, mc.preschedule = TRUE)           10 297.556    5.407     3.576    5.624     96.493    31.035

ここで何が起こっているのですか?

4

0 に答える 0