Параллельная обработка в R с использованием пакета doParallel

У меня есть цикл, который повторяется от 2 до указанного значения (т. е. columnCount). Значение i имеет решающее значение, поскольку все вычисления, происходящие внутри цикла, зависят от значения i.

Фрагмент цикла:

   > x1=runif(900000,9999,90999)
   > x2=runif(900000,0,9)
   > x3=runif(900000,5000,80000)
   > y=rep(0:1,450000)
   > data=data.frame(y,x1,x2,x3)
   > dim(data)
    [1] 900000   4 
   > columnCount = ncol(data)
   > yVar = names(data[1])

for (i in 2:columnCount) {  
    xVar[i] = names(data[i])
    result <- smbinning(df=data,y=yVar,x=xVar[i],p=0.05)
    }

Примечание. Столбец Y всегда является постоянным, тогда как столбцы x повторяются на 1 на каждом шаге (фактический фрейм данных имеет более 250 столбцов). Как мне перевести это, чтобы я мог использовать:

library(foreach)
library(doParallel)

foreach(icount(iters)) %dopar% {

person steven    schedule 27.11.2015    source источник
comment
Пожалуйста, укажите полного представителя и воспроизводимую проблему. ... не имеют значения. Скорее всего, вы вообще не должны использовать цикл.   -  person Roland    schedule 27.11.2015
comment
Там более 100 строк кода. Цикл объединяет одну переменную кадра данных за раз, используя smbinning.   -  person steven    schedule 27.11.2015
comment
Ваша задача — создать минимальный и воспроизводимый пример. Нам нужен не огромный объем кода, а что-то небольшое, что демонстрирует вашу проблему и может быть запущено в сеансе R.   -  person Roland    schedule 27.11.2015
comment
Лучше, но не хорошо. Изучите еще FAQ, на который я ссылался.   -  person Roland    schedule 27.11.2015
comment
Обратите внимание, что текущий набор данных не создает бины, фактический набор данных занимает около 40 секунд для бинирования одного столбца.   -  person steven    schedule 29.11.2015


Ответы (1)


Как насчет использования mclapply из пакета parallel. Что-то вроде приведенного ниже, например:

require(smbinning) # caveat: I never used this package
data(iris) 

names(iris) <- gsub("\\.","",names(iris)) # didn't like dots
mclapply(2:NCOL(iris), function(varb) 
smbinning(df = iris[,c(1,varb)], 
            y = names(iris[,c(1,varb)])[1], 
            x = names(iris[,c(1,varb)])[2],
            p = 0.05))
person Raad    schedule 27.11.2015