获取数据并在找不到对象中运行foreach

问题描述 投票:0回答:1

我正在尝试将迭代数据库的

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

知道为什么它不起作用吗?

r foreach
1个回答
0
投票

按照以下步骤操作

  1. 注册并行后端。
  2. 在每个并行工作线程中建立数据库连接。
  3. 仅将所需的物品传递给工人。
  4. 使用 .export 确保所有必要的对象/函数都可用。
© www.soinside.com 2019 - 2024. All rights reserved.