foreach 实现崩溃并在 R 中生成错误
foreach implementation crashes and generates error in R
我不熟悉在 R 中使用 foreach
包,需要一些关于以下方面的提示
我的代码。
我有一个包含 location.Id
和 iterationID
的数据框,如下所示
exp_df <- data.frame(location.Id = sample(1:10, 1000, replace = T),
iterationID = 1:1000)
对于 exp_df
中的每个唯一 location.Id
,我有变量 x1
、x2
、x3
等,这是
在我的目录中保存为 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
然后做
使用 x1
、x2
和 x3
的一些计算如下
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)
}
我不熟悉在 R 中使用 foreach
包,需要一些关于以下方面的提示
我的代码。
我有一个包含 location.Id
和 iterationID
的数据框,如下所示
exp_df <- data.frame(location.Id = sample(1:10, 1000, replace = T),
iterationID = 1:1000)
对于 exp_df
中的每个唯一 location.Id
,我有变量 x1
、x2
、x3
等,这是
在我的目录中保存为 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
然后做
使用 x1
、x2
和 x3
的一些计算如下
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)
}