Как я могу распараллелить в r на окнах - пример?

17

Как получить параллелизацию кода для работы в r в Windows? Включите простой пример. Публикация этого автоответчика, потому что это было довольно неприятно для работы. Вы обнаружите, что параллельный пакет НЕ работает сам по себе, но пакетный снегопад работает очень хорошо.

    
задан Carbon 29.05.2014 в 07:32
источник

4 ответа

25

Проводя это, потому что это заставило меня чертовски навсегда разобраться. Вот простой пример распараллеливания в r, который позволит вам проверить, работают ли для вас все, и вы попадаете на правильный путь.

library(snow)
z=vector('list',4)
z=1:4
system.time(lapply(z,function(x) Sys.sleep(1)))
cl<-makeCluster(###YOUR NUMBER OF CORES GOES HERE ###,type="SOCK")
system.time(clusterApply(cl, z,function(x) Sys.sleep(1)))
stopCluster(cl)

Вы также должны использовать библиотеку doSNOW для регистрации foreach в снежном кластере, это приведет к автоматическому распараллеливанию множества пакетов. Команда для регистрации - registerDoSNOW(cl)cl - возвращаемое значение из makeCluster() ), команда, которая отменяет регистрацию, равна registerDoSEQ() . Не забудьте выключить кластеры.

    
ответ дан Carbon 29.05.2014 в 07:32
источник
10

Это сработало для меня, я использовал пакет doParallel, потребовалось 3 строки кода:

# process in parallel
library(doParallel) 
cl <- makeCluster(detectCores(), type='PSOCK')
registerDoParallel(cl)

# turn parallel processing off and run sequentially again:
registerDoSEQ()

Расчет случайного леса уменьшился с 180 секунд до 120 секунд (на компьютере с Windows с 4 ядрами).

    
ответ дан Sander van den Oord 07.05.2015 в 15:02
источник
4

Я думаю, что эти библиотеки помогут вам:

foreach (facilitates executing the loop in parallel)
doSNOW (I think you already use it)
doMC (multicore functionality of the parallel package)

Пусть эта статья также поможет вам

Ссылка

Ссылка

    
ответ дан rischan 29.05.2014 в 08:12
источник
2

На основе информации здесь я был способный преобразовать следующий код в параллельную версию, работающую под R Studio в Windows 7.

Исходный код:

#
# Basic elbow plot function
#
wssplot <- function(data, nc=20, seed=1234){
    wss <- (nrow(data)-1)*sum(apply(data,2,var))
    for (i in 2:nc){
        set.seed(seed)
        wss[i] <- sum(kmeans(data, centers=i, iter.max=30)$withinss)}
    plot(1:nc, wss, type="b", xlab="Number of clusters", 
       ylab="Within groups sum of squares")
}

Параллельный код:

library("parallel")

workerFunc <- function(nc) {
  set.seed(1234)
  return(sum(kmeans(my_data_frame, centers=nc, iter.max=30)$withinss)) }

num_cores <- detectCores()
cl <- makeCluster(num_cores)
clusterExport(cl, varlist=c("my_data_frame")) 
values <- 1:20 # this represents the "nc" variable in the wssplot function
system.time(
  result <- parLapply(cl, values, workerFunc) )  # paralel execution, with time wrapper
stopCluster(cl)
plot(values, unlist(result), type="b", xlab="Number of clusters", ylab="Within groups sum of squares")

Не предлагая это идеально или даже лучше всего, новичок, демонстрирующий, что параллель, похоже, работает под Windows. Надеюсь, что это поможет.

    
ответ дан Mark 17.01.2015 в 15:16
источник