Использование -snowfall- (или других пакетов) для параллельного повторения пользовательской функции

Этот вопрос связан с этим, где я спрашивал, как скопировать пользовательскую функцию. Теперь я хотел бы распараллелить операции, чтобы сэкономить время. То, что я предварительно сделал, это:

  1. Я определил пользовательскую функцию my.fun(), который возвращает outputматрица с 1000 строки и 20 колонны.

  2. Я повторяю, говорю 5 раз outputи сохранить результаты в одной матрице под названием final через: final <- do.call(rbind, replicate(5, my.fun(), simplify=FALSE)), Следовательно, в этом примере final это 5000матрица

То, что я хотел бы сделать сейчас, это распараллелить 5 (или даже больше..) output репликации до привязки результатов в 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 эффективным способом (в действительности я должен сделать много копий..).

2 ответа

Решение

sfSapply надеется fun быть функцией, но вы передаете результат одного вызова my.fun, То есть вы хотите сдать my.funне my.fun (),

У меня нет опыта работы с параллельными вычислениями в R. Мне пришлось добавить фиктивный аргумент в функцию my.func, иначе sfSapply жалуется с этой ошибкой

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

Поэтому я добавляю х в качестве аргумента

  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
Другие вопросы по тегам