foreach 实现崩溃并在 R 中生成错误

foreach implementation crashes and generates error in R

我不熟悉在 R 中使用 foreach 包,需要一些关于以下方面的提示 我的代码。

我有一个包含 location.IditerationID 的数据框,如下所示

exp_df <- data.frame(location.Id = sample(1:10, 1000, replace = T),
                      iterationID = 1:1000)

对于 exp_df 中的每个唯一 location.Id,我有变量 x1x2x3 等,这是 在我的目录中保存为 csv 文件

dat <- data.frame(location.Id = 1:10,
                  x1 = rnorm(10),
                  x2 = rnorm(10),
                  x3 = rnorm(10))

data.table::fwrite(dat, 'dat.csv')

我的目标是 exp_df 的每一行,我想 select 它是什么 location.Id 然后做 使用 x1x2x3 的一些计算如下

library(foreach)
library(doParallel)

myClusters <- makeCluster(6)  
registerDoParallel(myClusters)

results <- 
foreach(i = 1:nrow(exp_df)) %dopar% 
  
{
 
  library(data.table) 
  library(dplyr)
  
  temp <- exp_df[i, ]
 
  mydat <- fread('dat.csv')[location.Id == temp$location.Id] 

  mydat <- mydat %>% dplyr::mutate(finalVal = x1 + x2 + x3)
  
  return(mydat)
}

stopCluster(myClusters)

我对 location_Id 的实际计算更为复杂,并且会读取更多单独的 csv 文件,例如 dat,因此以上是对我的问题的简化。同样出于某种原因,我无法在 foreach 循环外预读 dat,而必须在 foreach 循环内读入

我的问题是,因为在 foreach 循环中,我正在读取一个名为 dat.csv 的文件,如果各个内核碰巧同时尝试读取 dat,它是否会产生任何冲突?

当我为我的实际代码实现上述代码时,R 开始崩溃并给出以下错误

Error in serialize(data, node$con) : error writing to connection

产生上述错误的原因是什么?

谢谢

我做了一些似乎有效的事情,想知道是否有人对此有意见。

我把我的 exp_df 分成小块

splitdf <- split(exp_df, (as.numeric(rownames(exp_df))-1) %/% 50) 

然后运行每个块的上述代码,然后稍后合并我的结果

final_result <- list()
for(l in 1:length(splitdf)) {

    exp_df <- splitdf[[l]]

    myClusters <- makeCluster(6)  
    registerDoParallel(myClusters)

    results <- foreach(i = 1:nrow(exp_df)) %dopar% 

    {

      library(data.table) 
      library(dplyr)

      temp <- exp_df[i, ]

      mydat <- fread('dat.csv')[location.Id == temp$location.Id] 

      mydat <- mydat %>% dplyr::mutate(finalVal = x1 + x2 + x3)

     return(mydat)
  }

stopCluster(myClusters)

final_result[[l]]  <- rbindlist(result)
}