sql >> Base de Datos >  >> RDS >> PostgreSQL

foreach %dopar% + RPostgreSQL

Es más eficiente crear la conexión a la base de datos una vez por trabajador, en lugar de una vez por tarea. Desafortunadamente, mclapply no proporciona un mecanismo para inicializar los trabajadores antes de ejecutar las tareas, por lo que no es fácil hacerlo usando el backend doMC, pero si usa el backend doParallel, puede inicializar los trabajadores usando clusterEvalQ. Aquí hay un ejemplo de cómo reestructurar el código:

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

Dado que doParallel y clusterEvalQ están usando el mismo objeto de clúster cl , el bucle foreach tendrá acceso al objeto de conexión de la base de datos con al ejecutar las tareas.