R параллельный пакет - производительность очень низкая в моем игрушечном примере - PullRequest
3 голосов
/ 13 апреля 2020

Я пытаюсь произвести выборку для двух векторов 1000 раз с заменой и рассчитать соотношение средних. Повторите этот процесс 10000 раз.

Я написал пример параллельного кода, но это занимает гораздо больше времени, чем использование простых циклов for на одной машине.

ratio_sim_par <- function(x1, x2, nrep = 1000) {

# Initiate cluster
cl <- makeCluster(detectCores() - 1) #Leave one core for other operations 

clusterExport(cl, varlist=c("x1", "x2", "nrep"), envir=environment())

Tboot <- parLapply(cl, 1:nrep, function(x){

    n1 <- length(x1)
    n2 <- length(x2) 

    xx1 <- sample(x1, n1, replace = TRUE) # sample of size n1 with replacement from x1
    xx2 <- sample(x2, n2, replace = TRUE) # sample of size n2 with replacement from x2
    return(mean(xx1) / mean(xx2))  
})

stopCluster(cl)

return(unlist(Tboot))

}

ratio_sim_par(x1, x2, 10000)

Системное время невыносимо. Может ли кто-нибудь помочь мне понять мою ошибку? Спасибо

1 Ответ

2 голосов
/ 13 апреля 2020

Распределение задач по разным узлам требует больших вычислительных затрат и может свести на нет любые выгоды, которые вы получаете от распараллеливания вашего скрипта. В вашем случае вы звоните parLapply 10000 раз и, вероятно, тратите больше ресурсов на выполнение каждой задачи, чем фактически делаете повторную выборку. Попробуйте что-то подобное с непараллельной версией ratio_sim_par:

mclapply(1:10000, ratio_sim_par, x1, x2, nrep = 1000, mc.cores = n_cores)

mclapply разделит работу на столько ядер, сколько у вас будет доступно, и разветвит ее один раз. Я использую mclapply вместо parLapply, потому что я к этому привык и не требует такой большой настройки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...