2016-10-10 13 views
2

У меня есть конкретная симуляция для выполнения, которая занимает некоторое время, чтобы работать в R. Поскольку я хочу выполнить 1000 симуляций, я решил использовать «параллельный» пакет для распространения этих симуляций на 4 ядра. Я знаю, что я могу получить результирующий вектор, если у меня есть функция вроде следующего.Как распараллелить функцию с несколькими параметрами?

results_parallel <- parSapply(cl, c(1000,1000,1000,1000), rnorm) 

здесь RNorm() имеет только один параметр, как на входе, так что я могу попросить, чтобы произвести 4000 значений с помощью 4 ядра.

Но мое моделирование имеет более одного параметра. Мой вопрос в том, что, поскольку у меня есть несколько параметров в качестве входных данных, как я могу определить, какой параметр должен быть рассчитан с использованием 4 ядер? Если simulation1(A,B,C,m) - это моя функция, где m - количество симуляций, я хочу попросить каждое ядро ​​выполнить симуляцию 250 раз, так что, наконец, я смогу получить 1000 симуляций. Может ли кто-нибудь дать мне подсказку?

ответ

3

Вы можете попробовать создать оболочку функции, которая принимает один аргумент, а не несколько.

rnorm1 <- function(ls){ 
    rnorm(n = ls$n, mean = ls$mean, sd = ls$sd) 
} 

cl <- makeCluster(2) 

example_list <- list(
     list(n=1000, mean = 0, sd = 1), 
     list(n=1000, mean = 1, sd = 2) 
) 

results_parallel <- parSapply(cl, example_list, rnorm1) 

Вам просто нужно указать нужный список аргументов, чтобы он был списком списков.

+0

Это было действительно хорошее решение. Я стараюсь, и это сработало хорошо. Благодарю. –

+1

Если решение ответило на ваш вопрос, убедитесь, что вы отметили его как принятое, чтобы помочь другим найти его в будущем. – rosscova

1

Я не уверен, что это именно то, что вам нужно, но вы должны иметь возможность добавлять параметры, которые должны быть переданы в rnorm внутри вашего вызова функции. Я не использовал parSapply раньше, но здесь с llply:

doMC::registerDoMC(cores = 4) 
results <- plyr::llply(.data = c(1000,1000,1000,1000), 
         .fun = rnorm, mean = 1, sd = 0.4, 
         .parallel = T 
) 

Обратите внимание на параметры mean и sd передается в rnorm внутри llply вызова. parSapply должен иметь возможность обрабатывать это точно так же. Например:

results_parallel <- parSapply(cl, 
           X = c(1000,1000,1000,1000), 
           FUN = rnorm, mean = 1, sd = 0.4 
)