parSapply для набора данных (запуск функции на нескольких ядрах для каждой строки набора данных) - PullRequest
0 голосов
/ 22 января 2019

Этот вопрос конкретно касается использования нескольких ядер для запуска данной функции, когда для этой функции требуется пакет и дополнительные аргументы.

У меня есть большой набор данных следующей формы:

Event_ID = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3)
Type=c("A","B","C","D","E","A","B","C","D","E","A","B","C","D")
Revenue1=c(24,9,51,7,22,15,86,66,0,57,44,93,34,37)
Revenue2=c(16,93,96,44,67,73,12,65,81,22,39,94,41,30)
z = data.frame(Event_ID,Type,Revenue1,Revenue2)

У меня довольно сложная функция, и я пытаюсь запустить ее на нескольких ядрах. Ниже я представляю простую функцию, где функция по существу берет сумму двух столбцов и вычитает значение умножения двух матриц (мои извинения, если функция слишком упрощена, но я пытаюсь понять, как работает параллельная обработка). Вот функция ниже:

set.seed(100)
library(truncnorm)
alpha_old=matrix(c(1,5),nrow=1)
library(truncnorm)
Total_Revenue=function(data,alpha_old){
  for (i in 1:nrow(z)){
    beta_old=matrix(rtruncnorm(2,a=1,b=10,mean =5,sd=1),ncol=1) #generates beta for each row
    adjustment_factor = alpha_old%*%beta_old #computes adjustment factor for each row
    z[i,'Total_Rev'] = z[i,'Revenue1']+z[i,'Revenue2']-adjustment_factor 
  }
  return(z)
}
Total = Total_Revenue(data=z,alpha=alpha_old)
print(Total)

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

Теперь я хочу реализовать следующее с использованием нескольких ядер, используя parSapply. Я попробовал следующее:

library(parallel)
library(doParallel)
no_cores <- detectCores() - 1
registerDoParallel(cores=no_cores)
cl2 <- makeCluster(no_cores)
invisible(clusterEvalQ(cl2, library(truncnorm)))
clusterExport(cl=cl2, varlist=c("alpha_old","z"), envir=environment())
result1 = parSapply(cl2, X= 1:nrow(z),FUN=Total_Revenue,data=z,alpha_old=alpha_old)
stopCluster(cl2)

Я получаю следующее сообщение:

Error in checkForRemoteErrors(val) : 14 nodes produced errors; first error: unused argument (X[[i]])

Это первый раз, когда я пытаюсь использовать многоядерную обработку, и я не очень знаком с пакетами Parallel и DoParallel. Фактический набор данных, с которым я работаю, имеет около 5 миллионов наблюдений, и функция включает в себя дополнительные шаги (сравнение значений между другими значениями набора данных), которые я удалил из примера функции. Любая помощь в решении этого вопроса будет принята с благодарностью. Заранее спасибо.

P.S. Вывод, который я получаю при запуске функции на одном ядре:

enter image description here

P.P.S. Данные примера взяты из другого вопроса, который я разместил здесь: Обработка Gpu R (Как использовать обработку Gpu для запуска функции на подмножествах набора данных)

...