0

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

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

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

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

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

    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期望fun成为一个函数,但您将一次调用的结果my.fun交给. 也就是你要交my.fun,不是my.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 回答