PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

foreach %dopar% + RPostgreSQL

Es ist effizienter, die Datenbankverbindung einmal pro Worker statt einmal pro Aufgabe zu erstellen. Leider bietet mclapply keinen Mechanismus zum Initialisieren der Worker vor dem Ausführen von Aufgaben, daher ist es nicht einfach, dies mit dem doMC-Backend zu tun, aber wenn Sie das doParallel-Backend verwenden, können Sie die Worker mit clusterEvalQ initialisieren. Hier ist ein Beispiel für die Umstrukturierung des Codes:

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 und clusterEvalQ dasselbe Cluster-Objekt cl verwenden , hat die foreach-Schleife Zugriff auf das Datenbankverbindungsobjekt con beim Ausführen der Aufgaben.