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

foreach %dopar% + RPostgreSQL

È più efficiente creare la connessione al database una volta per lavoratore, anziché una volta per attività. Sfortunatamente, mclapply non fornisce un meccanismo per inizializzare i lavoratori prima di eseguire le attività, quindi non è facile farlo usando il backend doMC, ma se usi il backend doParallel, puoi inizializzare i lavoratori usando clusterEvalQ. Ecco un esempio di come ristrutturare il codice:

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

Poiché doParallel e clusterEvalQ utilizzano lo stesso oggetto cluster cl , il ciclo foreach avrà accesso all'oggetto di connessione al database con durante l'esecuzione delle attività.