r-如何将函数集群应用于并行计算



我有一个函数sum_var,它以整数作为输入,并返回实数作为输出。我在一些输入上检查了这个函数,它运行得很好。

我想使用clusterApply来利用我的CPU(6核和12个逻辑处理器(。我试图修改类中给出的代码

library("parallel")
cl <- makeCluster(6)
res_par <- clusterApply(cl, 1:10000, fun = sum_var)

但它返回一个错误Error in checkForRemoteErrors(val) : 10000 nodes produced errors; first error: object 'df_simulate' not found

你能详细说明一下如何实现我的目标吗?以下是完整的代码。

### Generate dataframe
n_simu <- 1000
set.seed(1)
df_simulate <- data.frame(x_1 = rnorm(n_simu))
for (k in 2:10000) {
set.seed(k)
df_simulate[, paste0("x_", k)] <- rnorm(n_simu)
}
df_simulate[, "y"] <- runif(n_simu, 0, 0.5)
df_simulate[df_simulate$x_40 > 0 & df_simulate$x_99 > 0.8, "y"] <-
df_simulate[df_simulate$x_40 > 0 & df_simulate$x_99 > 0.8, "y"] + 5.75
df_simulate[df_simulate$x_40 > 0 & df_simulate$x_99 <= 0.8 & df_simulate$x_30 > 0.5, "y"] <-
df_simulate[df_simulate$x_40 > 0 & df_simulate$x_99 <= 0.8 & df_simulate$x_30 > 0.5, "y"] + 18.95
df_simulate[df_simulate$x_40 > 0 & df_simulate$x_99 <= 0.8 & df_simulate$x_30 <= 0.5, "y"] <-
df_simulate[df_simulate$x_40 > 0 & df_simulate$x_99 <= 0.8 & df_simulate$x_30 <= 0.5, "y"] + 20.55
df_simulate[df_simulate$x_40 <= 0 & df_simulate$x_150 < 0.5, "y"] <-
df_simulate[df_simulate$x_40 <= 0 & df_simulate$x_150 < 0.5, "y"] - 5
df_simulate[df_simulate$x_40 <= 0 & df_simulate$x_150 >= 0.5, "y"] <-
df_simulate[df_simulate$x_40 <= 0 & df_simulate$x_150 >= 0.5, "y"] - 10
### Function to calculate the sum of variances
n_min <- 5
index <- n_min:(1000 - n_min)
sum_var <- function(m){
df1 <- df_simulate[, m]
df2 <- as.data.frame(sort(df1))
for (i in index){
df3 <- df2[1:i, 1]
df4 <- df2[(i+1):1000, 1]
df2[i, 2] <- sd(df3) + sd(df4)
}
position <- which.min(df2[, 2]) 
return(df2[position, 1])
}
### Parallel Computing    
library("parallel")
cl <- makeCluster(6)
res_par <- clusterApply(cl, 1:10000, fun = sum_var)

当您在Windows上使用makeCluster时;集群";使用新的R过程。在那里,只加载基本包,并且进程不包含您在全局环境中定义的变量。因此,您需要将函数中使用的所有变量导出到集群中。为此,您可以使用clusterExport:

library("parallel")
cl <- makeCluster(6)
clusterExport(cl, "df_simulate")
res_par <- clusterApply(cl, 1:10000, fun = sum_var)

以下是R.中不同并行化技术的小概述和介绍