sql >> Database teknologi >  >> RDS >> PostgreSQL

foreach %dopar% + RPostgreSQL

Det er mere effektivt at oprette databaseforbindelsen én gang pr. arbejder i stedet for én gang pr. opgave. Desværre giver mclapply ikke en mekanisme til initialisering af arbejderne før udførelse af opgaver, så det er ikke let at gøre dette ved at bruge doMC-backend, men hvis du bruger doParallel-backend, kan du initialisere arbejderne ved hjælp af clusterEvalQ. Her er et eksempel på, hvordan du omstrukturerer 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)
})

Da doParallel og clusterEvalQ bruger det samme klyngeobjekt cl , vil foreach loop have adgang til databaseforbindelsesobjektet con når opgaverne udføres.



  1. ROUND(dato) Funktion i Oracle

  2. Sådan eksporteres forespørgselsresultat til Excel i Oracle SQL Developer?

  3. Kan ikke oprette forbindelse til lokal MySQL-server via socket '/var/mysql/mysql.sock' (38)

  4. ER-diagrammer i IRI Workbench