在数据集上parSapply(在数据集的每一行的多个核上运行函数)

时间:2019-01-22 17:33:01

标签: r parallel-processing multiprocessing doparallel

这个问题专门关于使用多个内核来运行给定功能的情况,该功能需要一个程序包和其他参数才能运行。

我有一个以下形式的大型数据集:

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]])

这是我第一次尝试使用多核处理,并且对并行和doParallel软件包不太熟悉。我正在使用的实际数据集大约有500万个观测值,并且该函数涉及其他步骤(在数据集的其他值之间进行比较),这些步骤已从示例函数中删除。任何帮助解决此问题将不胜感激。预先感谢。

P.S。通过在一个内核上运行该函数获得的输出:

enter image description here

P.P.S。示例数据取自我在此处发布的另一个问题: Gpu processing R (How to use Gpu processing to run a function on subsets of a dataset)

0 个答案:

没有答案