gpt4 book ai didi

postgresql - foreach %dopar% + RPostgreSQL 的

转载 作者:行者123 更新时间:2023-11-29 11:20:26 25 4
gpt4 key购买 nike

我正在使用 RPostgreSQL 连接到本地数据库。该设置在我的 Linux 机器上运行良好。 R 2.11.1,Postgres 8.4。

我正在使用带有多核 (doMC) 并行后端的“foreach”来包装一些重复查询(数量为几千个)并将结果附加到数据结构中。奇怪的是,如果我使用 %do% 它会工作,但当我切换到 %dopar% 时失败,只有一次迭代时除外(如下所示)

我想知道它是否与单个连接对象有关,所以我创建了 10 个连接对象,并根据“我”是什么,为该查询提供了一个特定的 con 对象,具体取决于我模 10。(指示下面只有 2 个连接对象)。计算 eval(expr.01) 的表达式包含/是取决于“i”是什么的查询。

我无法理解这些特定的错误消息。我想知道是否有任何方法可以使这项工作成功。

谢谢。
维沙尔贝尔萨雷

R 片段如下:

> id.qed2.foreach <- foreach(i = 1588:1588, .inorder=FALSE) %dopar% { 
+ if (i %% 2 == 0) {con <- con0};
+ if (i %% 2 == 1) {con <- con1};
+ fetch(dbSendQuery(con,eval(expr.01)),n=-1)$idreuters};
> id.qed2.foreach
[[1]]
[1] 411 414 2140 2406 4490 4507 4519 4570 4571 4572 4703 4731
[109] 48765 84312 91797

> id.qed2.foreach <- foreach(i = 1588:1589, .inorder=FALSE) %dopar% {
+ if (i %% 2 == 0) {con <- con0};
+ if (i %% 2 == 1) {con <- con1};
+ fetch(dbSendQuery(con,eval(expr.01)),n=-1)$idreuters};
Error in stop(paste("expired", class(con))) :
no function to return from, jumping to top level
Error in stop(paste("expired", class(con))) :
no function to return from, jumping to top level
Error in { :
task 1 failed - "error in evaluating the argument 'res' in selecting a method for function 'fetch'"
>

编辑:我改变了一些东西,(仍然不成功),但有几件事暴露了出来。在循环中建立的连接对象,而不是通过 dbDisconnect“断开连接”,导致连接挂起,如 Postgres 的/var/log 所示。当我这样做时,出现了一些新的错误消息:

> system.time(
+ id.qed2.foreach <- foreach(i = 1588:1590, .inorder=FALSE,
.packages=c("DBI", "RPostgreSQL")) %dopar% {drv0 <- dbDriver("PostgreSQL");
con0 <- dbConnect(drv0, dbname='nseindia');
list(idreuters=fetch(dbSendQuery(con0,eval(expr.01)),n=-1)$idreuters);
dbDisconnect(con0)})
Error in postgresqlExecStatement(conn, statement, ...) :
no function to return from, jumping to top level
Error in postgresqlExecStatement(conn, statement, ...) :
no function to return from, jumping to top level
Error in postgresqlExecStatement(conn, statement, ...) :
no function to return from, jumping to top level
Error in { :
task 1 failed - "error in evaluating the argument 'res' in selecting a method for function 'fetch'"

最佳答案

为每个工作人员创建一次数据库连接比为每个任务创建一次更有效。不幸的是,mclapply 没有提供在执行任务之前初始化 worker 的机制,因此使用 doMC 后端不容易做到这一点,但如果使用 doParallel 后端,则可以使用 clusterEvalQ 初始化 worker。以下是如何重构代码的示例:

library(doParallel)
cl <- makePSOCKcluster(detectCores())
registerDoParallel(cl)

clusterEvalQ(cl, {
library(DBI)
library(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, dbname="nsdq")
NULL
})

id.qed.foreach <- foreach(i=1588:3638, .inorder=FALSE,
.noexport="con",
.packages=c("DBI", "RPostgreSQL")) %dopar% {
lst <- eval(expr.01) #contains the SQL query which depends on 'i'
qry <- dbSendQuery(con, lst)
tmp <- fetch(qry, n=-1)
dt <- dates.qed2[i]
list(date=dt, idreuters=tmp$idreuters)
}

clusterEvalQ(cl, {
dbDisconnect(con)
})

由于 doParallel 和 clusterEvalQ 使用相同的集群对象 cl,foreach 循环将在执行任务时访问数据库连接对象 con

关于postgresql - foreach %dopar% + RPostgreSQL 的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3902796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com