带有 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)
}