0

この質問は、ユーザー定義関数を複製する方法を尋ねていたこの質問に関連しています。ここで、時間を節約するために操作を並列化したいと思います。私が事前に行ったことは次のとおりです。

  1. 行と列の行列my.fun()を返すカスタム関数を定義しました。output100020

  2. 私はsaytimesを複製5output、結果を次のように呼び出される単一の行列に格納しfinalますfinal <- do.call(rbind, replicate(5, my.fun(), simplify=FALSE))。したがって、この例finalでは5000-rows行列です。

私が今やりたいのは、結果をマトリックスoutputにバインドする前に、5つ(またはそれ以上)の複製を並列化することです。final

どのようにそれをしますか?私がこれまでに(間違って)行ったことは次のとおりです。

    library(snowfall)

    sfInit(parallel = TRUE, cpus = 4, type = "SOCK")

    # previously defined objects manipulated within my.fun
    sfExport(...)

    my.fun = function() {
       ...
       return(output)
    }

    final <- do.call(rbind, sfSapply(1:5, fun=my.fun(), simplify=FALSE))

    sfStop()

しかし、それは戻ります:

Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'fun' of mode 'function' was not found

どんな助けでも大歓迎です!必ずしも使用したくないことを考慮してください。-snowfall-最終的な目標は、の計算をfinal効率的な方法で並列化することです(実際には、多くの複製を作成する必要があります)。

4

2 に答える 2

3

sfSapply関数であることが期待されますが、への1回の呼び出しの結果funを渡します。つまり、ではなく、引き渡したいということです。my.funmy.funmy.fun ()

于 2013-01-28T18:27:40.553 に答える
1

R での並列計算の経験がありません。関数 my.func に仮引数を追加する必要がありました。そうしないsfSapplyと、このエラーが発生します。

 first error: unused argument(s) (X[[1]])

だから私は引数として x を追加します

  my.fun <- function(x) matrix(1:4, 2,2)

今、私は並列とsapply解決策をベンチマークしようとしました

  sfInit(parallel = TRUE, cpus = 4)
  library(rbenchmark)
  benchmark(
  pp = sfSapply(1:20000, fun=my.fun, simplify=FALSE),
  nopp = sapply(1:20000, FUN=my.fun, simplify=FALSE))

並列ソリューションは従来のソリューションよりも遅いです!! 私は本当に混乱しています。おそらく、R 並列コンピューティングの経験が豊富な他の人が論理的な説明をしてくれるでしょう..

 test replications elapsed relative user.self sys.self user.child sys.child
2 nopp          100   15.22    1.000     13.90     0.02         NA        NA
1   pp          100   27.28    1.792     11.95     2.04         NA        NA
于 2013-01-28T18:44:55.237 に答える