带有 doParallel 的 foreach 不适用于超过 1 个核心
foreach with doParallel doesn't work with more than 1 core
我在启动此功能时遇到问题:
blocs <- split(df, 1 + (1:nrow(df)) %% ncores)
cl <- makeCluster(ncores)
registerDoParallel(cl)
if (mode == "batch"){
res <- foreach(i = blocs, .combine = "cbind", .export = c("batch_gradient_descent", "sampled_df", "add_constant", "sigmoid", "log_loss_function")) %dopar% {
coefs <- batch_gradient_descent(df, colnames(X), colnames(y), learning_rate, max_iter)
}
return(res)
}
当我 运行 它有 1 个核心时,它可以工作。当我使用 2 个或更多内核时,它不会进入我的 foreach 函数,什么也没有发生,我也没有错误。
我可能会遗漏一些东西,但经过大量搜索后,无法找到解决方案!
有人可以给我一些关于这个案例的提示吗?
blocs <- split(df, 1 + (1:nrow(df)) %% ncores)
将产生 ncores
许多包含相同数据的批次(例如只有 3 个副本)。尝试做某事。像这样:
library(tidyverse)
library(doParallel)
ncores <- 3
df <- iris
blocs <-
df %>%
mutate(batch = row_number() %% ncores) %>%
nest(-batch) %>%
pull(data)
cl <- makeCluster(ncores)
registerDoParallel(cl)
res <- foreach(i = blocs, .combine = "rbind") %dopar% {
Sys.sleep(5)
coefs <- mean(i$Sepal.Length)
}
我在启动此功能时遇到问题:
blocs <- split(df, 1 + (1:nrow(df)) %% ncores)
cl <- makeCluster(ncores)
registerDoParallel(cl)
if (mode == "batch"){
res <- foreach(i = blocs, .combine = "cbind", .export = c("batch_gradient_descent", "sampled_df", "add_constant", "sigmoid", "log_loss_function")) %dopar% {
coefs <- batch_gradient_descent(df, colnames(X), colnames(y), learning_rate, max_iter)
}
return(res)
}
当我 运行 它有 1 个核心时,它可以工作。当我使用 2 个或更多内核时,它不会进入我的 foreach 函数,什么也没有发生,我也没有错误。 我可能会遗漏一些东西,但经过大量搜索后,无法找到解决方案!
有人可以给我一些关于这个案例的提示吗?
blocs <- split(df, 1 + (1:nrow(df)) %% ncores)
将产生 ncores
许多包含相同数据的批次(例如只有 3 个副本)。尝试做某事。像这样:
library(tidyverse)
library(doParallel)
ncores <- 3
df <- iris
blocs <-
df %>%
mutate(batch = row_number() %% ncores) %>%
nest(-batch) %>%
pull(data)
cl <- makeCluster(ncores)
registerDoParallel(cl)
res <- foreach(i = blocs, .combine = "rbind") %dopar% {
Sys.sleep(5)
coefs <- mean(i$Sepal.Length)
}