Использование -snowfall- (или других пакетов) для параллельного повторения пользовательской функции
Этот вопрос связан с этим, где я спрашивал, как скопировать пользовательскую функцию. Теперь я хотел бы распараллелить операции, чтобы сэкономить время. То, что я предварительно сделал, это:
Я определил пользовательскую функцию
my.fun()
, который возвращаетoutput
матрица с1000
строки и20
колонны.Я повторяю, говорю
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