sql >> Databasteknik >  >> RDS >> PostgreSQL

foreach %dopar% + RPostgreSQL

Det är mer effektivt att skapa databasanslutningen en gång per arbetare, snarare än en gång per uppgift. Tyvärr tillhandahåller mclapply ingen mekanism för att initiera arbetarna innan de utför uppgifter, så det är inte lätt att göra detta med doMC-backend, men om du använder doParallel-backend kan du initiera arbetarna med clusterEvalQ. Här är ett exempel på hur du strukturerar om koden:

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

Eftersom doParallel och clusterEvalQ använder samma klusterobjekt cl , kommer foreach loop att ha tillgång till databasanslutningsobjektet con när du utför uppgifterna.



  1. hur man fixar OperationalError:(psycopg2.OperationalError) server stängde anslutningen oväntat

  2. LADDA DATAINFIL Felkod:13

  3. Hur man får återställningsmodellen för en databas i SQL Server med T-SQL

  4. Så här gör du:Skapa utlösare för ändringsdatum för automatisk uppdatering med SQL Server 2008