【问题标题】:Using -snowfall- (or other packages) to parallel repeating a user-defined function使用 -snowfall- (或其他包)并行重复用户定义的函数
【发布时间】:2013-01-28 18:04:35
【问题描述】:

这个问题与this one 有关,我在其中询问如何复制用户定义的函数。现在我想并行化操作以节省时间。我初步做的是:

  1. 我定义了一个自定义函数my.fun(),它返回output,一个包含1000 行和20 列的矩阵。

  2. 我复制 5output,并将结果存储在名为 final 的单个矩阵中:final <- do.call(rbind, replicate(5, my.fun(), simplify=FALSE))。因此,在这个例子中,final 是一个5000-rows 矩阵。

我现在想做的是在将结果绑定到 final 矩阵之前并行化 5 个(甚至更多......)output 复制。

你会怎么做?到目前为止,我(错误地)所做的是:

    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 的计算(实际上我必须进行大量复制..)。

【问题讨论】:

    标签: r parallel-processing snowfall


    【解决方案1】:

    sfSapply 期望 fun 是一个函数,但您将一次调用的结果交给my.fun。也就是说,你要交出my.fun,而不是my.fun ()

    【讨论】:

      【解决方案2】:

      我对 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
      

      【讨论】:

      • 并行化总是会产生一些开销。只有当并行执行的典型作业需要大量时间(例如至少几秒钟)时,并行处理才能真正提供优势。如果典型的作业需要几毫秒,那么不断启动作业将产生如此多的开销,以至于总处理时间增加。只需在 myfun 中添加几秒钟的睡眠时间即可看到差异。
      • @agstudy 对我来说同样的错误,我也必须添加 x 参数,谢谢!
      猜你喜欢
      • 2013-09-13
      • 2013-09-17
      • 2013-01-07
      • 1970-01-01
      • 2013-05-17
      • 2019-04-05
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多