我正在尝试将迭代数据库的
for loop
转换为foreach
。我想让它并行以加速我的 Linux 机器上的进程。在单核中,即使用 %do%
它可以在没有 doParallel
后端的情况下工作。
我正在连接到数据库,由于显而易见的原因,我无法在这里编写可重现的示例。但是,我会尝试编写一个在单核下工作的结构,而如果我尝试使用多核,则无法工作。
首先,一些有用的东西:
con <- DBI::dbConnect(RPostgres::Postgres(), service = "dbserver")
obj1 <- DBI::dbGetQuery(con, "SELECT XXX")$obj0
obj2 <- readcsv("some_file.csv")
myfunction <- function(some function)
res <- list()
foreach::foreach(obj0 = unique(obj1), .combine="rbind") %do% {
obj3 <- DBI::dbGetQuery(con, glue::glue("SELECT something
FROM somewhere WHERE obj0='{obj0}' limit 1;"))
obj4 <- myfunction(obj3)
res[[obj0]] <- purr::map_dbl(some arguments)}
这有效!
查看解决方案中的here后,我添加了以下内容:
cl <- parallel::makeCluster(parallel::detectCores() - 2,
type = "FORK")
doParallel::registerDoParallel(cl)
parallel::clusterEvalQ(cl, {
library(DBI)
library(RPostgreSQL)
con <- DBI::dbConnect(RPostgres::Postgres(), service = "dbserver")
obj1 <- DBI::dbGetQuery(con, "SELECT XXX")$obj0
NULL
})
请注意,我已将
obj1
移至 clusterEvalQ
内,并将 %do%
替换为 foreach 内的 %dopar%
。
我收到以下错误消息,
Error in unique(obj1) : object 'obj1' not found
知道为什么它不起作用吗?
按照以下步骤操作