#r #parallel-processing #cluster-computing
#r #параллельная обработка #кластерные вычисления
Вопрос:
У меня есть функция sum_var
, которая принимает целое число в качестве входных данных и возвращает действительное число в качестве выходных данных. Я проверил эту функцию на некоторых входах, и она работает хорошо.
Я хотел бы использовать clusterApply
для использования мой процессор (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 amp; df_simulate$x_99 > 0.8, "y"] <-
df_simulate[df_simulate$x_40 > 0 amp; df_simulate$x_99 > 0.8, "y"] 5.75
df_simulate[df_simulate$x_40 > 0 amp; df_simulate$x_99 <= 0.8 amp; df_simulate$x_30 > 0.5, "y"] <-
df_simulate[df_simulate$x_40 > 0 amp; df_simulate$x_99 <= 0.8 amp; df_simulate$x_30 > 0.5, "y"] 18.95
df_simulate[df_simulate$x_40 > 0 amp; df_simulate$x_99 <= 0.8 amp; df_simulate$x_30 <= 0.5, "y"] <-
df_simulate[df_simulate$x_40 > 0 amp; df_simulate$x_99 <= 0.8 amp; df_simulate$x_30 <= 0.5, "y"] 20.55
df_simulate[df_simulate$x_40 <= 0 amp; df_simulate$x_150 < 0.5, "y"] <-
df_simulate[df_simulate$x_40 <= 0 amp; df_simulate$x_150 < 0.5, "y"] - 5
df_simulate[df_simulate$x_40 <= 0 amp; df_simulate$x_150 >= 0.5, "y"] <-
df_simulate[df_simulate$x_40 <= 0 amp; 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)
Ответ №1:
При использовании makeCluster
в Windows для каждого «кластера» используется новый процесс R. Там загружаются только базовые пакеты, и процессы не содержат переменных, которые вы определили в своей глобальной среде. Поэтому вам необходимо экспортировать все переменные, которые вы используете в своей функции, в кластеры. Для этого вы можете использовать clusterExport
:
library("parallel")
cl <- makeCluster(6)
clusterExport(cl, "df_simulate")
res_par <- clusterApply(cl, 1:10000, fun = sum_var)
Вот небольшой обзор и введение в различные методы распараллеливания в R.
Комментарии:
1. Спасибо за исправление. Это работает нормально. Меня беспокоит только то, что мой процессор, похоже, работает только с 1 логическим процессором. Я не уверен, действительно ли выполняются параллельные вычисления. imgur.com/a/DwNuxNV