代码之家  ›  专栏  ›  技术社区  ›  Vishal Belsare

foreach%dopar%+rpostgresql

  •  7
  • Vishal Belsare  · 技术社区  · 14 年前

    我正在使用rpostgresql连接到本地数据库。安装程序在我的Linux机器上运行得很好。R 2.11.1,Postgres 8.4.

    我在用“foreach”处理多核(domc)并行后端,以包装一些重复的查询(编号几千),并将结果附加到数据结构中。奇怪的是,如果我使用了%do%,它就会工作,但是当我切换到%dopar%时失败,只有一个迭代时例外(如下所示)。

    我想知道它是否与单个连接对象有关,所以我创建了10个连接对象,根据“i”是什么,根据i模块10,为该查询提供了一个特定的con对象。(以下仅由两个连接对象指示)。计算为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'"
    
    2 回复  |  直到 7 年前
        1
  •  16
  •   Steve Weston    7 年前

    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)
    })
    

    cl con

        2
  •  2
  •   Vishal Belsare    14 年前

    pgparquery <- function(i) {
    drv <- dbDriver("PostgreSQL"); 
    con <- dbConnect(drv, dbname='nsdq'); 
    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]
    dbDisconnect(con);
    result <- list(date=dt, idreuters=tmp$idreuters)
    return(result)}
    
    id.qed.foreach <- foreach(i = 1588:3638, .inorder=FALSE, .packages=c("DBI", "RPostgreSQL")) %dopar% {pgparquery(i)}