Подтвердить что ты не робот

Как распараллеливать в r на windows - пример?

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

4b9b3361

Ответ 1

Проводя это, потому что это заставило меня чертовски навсегда разобраться. Вот простой пример распараллеливания в 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(). Не забудьте выключить кластеры.

Ответ 2

Это сработало для меня, я использовал пакет 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 ядрами).

Ответ 4

Основываясь на информации здесь, я смог преобразовать следующий код в параллельную версию, которая работала под 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. Надеюсь, что это поможет.

Ответ 5

Я публикую здесь кроссплатформенный ответ, потому что все остальные ответы, которые я нашел, были слишком сложными для того, что мне нужно было выполнить. Я использую пример, где я читаю во всех листах книги Excel.

# read in the spreadsheet 
parallel_read <- function(file){

    # detect available cores and use 70%
    numCores  = round(parallel::detectCores() * .70)

    # check if os is windows and use parLapply
    if(.Platform$OS.type == "windows") {

        cl <- makePSOCKcluster(numCores)
        parLapply(cl, file, readxl::read_excel)
        stopCluster(cl)

        return(dfs)

    # if not Windows use mclapply
    } else {

        dfs <-parallel::mclapply(excel_sheets(file), 
                         readxl::read_excel, 
                         path = file,
                         mc.cores=numCores)

        return(dfs)

   }
}