foreach%dopar%RPostgreSQL

foreach%dopar%RPostgreSQL,第1张

概述我正在使用RPostgreSQL连接到本地数据库.该设置在我的 Linux机器上运行正常. R 2.11.1,Postgres 8.4. 我使用多核(doMC)并行后端玩’foreach’来包装一些重复查询(编号为几千)并将结果附加到数据结构中.奇怪的是,如果我使用%do%但是当我切换到%dopar%时会失败,只有一次迭代时会出现异常(如下所示) 我想知道它是否与单个连接对象有关,所以我创建了10 我正在使用RPostgresql连接到本地数据库.该设置在我的 Linux机器上运行正常. R 2.11.1,Postgres 8.4.

我使用多核(doMC)并行后端玩’foreach’来包装一些重复查询(编号为几千)并将结果附加到数据结构中.奇怪的是,如果我使用%do%但是当我切换到%dopar%时会失败,只有一次迭代时会出现异常(如下所示)

我想知道它是否与单个连接对象有关,所以我创建了10个连接对象,并且取决于我是什么,为该查询给出了某个con对象,具体取决于i modulo 10.(仅在下面表示2个连接对象).被评估的表达式eval(expr.01),包含/是取决于’i’的查询.

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

谢谢.
Vishal Belsare

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,n=-1)$IDreuters};Error in stop(paste("expired",class(con))) :   no function to return from,jumPing to top levelError in stop(paste("expired",jumPing to top levelError 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,n=-1)$IDreuters);dbdisconnect(con0)})Error in postgresqlExecStatement(conn,statement,...) :   no function to return from,jumPing to top levelError in postgresqlExecStatement(conn,jumPing to top levelError in { :   task 1 Failed - "error in evaluating the argument 'res' in selecting a method for function 'fetch'"
每个worker创建一次数据库连接效率更高,而不是每个任务一次.不幸的是,mclapply在执行任务之前没有提供初始化工作程序的机制,因此使用doMC后端执行此 *** 作并不容易,但如果使用doParallel后端,则可以使用clusterEvalQ初始化工作程序.以下是如何重构代码的示例:
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,.noexport="con","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.

总结

以上是内存溢出为你收集整理的foreach%dopar%RPostgreSQL全部内容,希望文章能够帮你解决foreach%dopar%RPostgreSQL所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1164242.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存