sql >> Database >  >> RDS >> PostgreSQL

foreach %dopar% + RPostgreSQL

Het is efficiënter om de databaseverbinding eenmaal per werknemer te maken in plaats van eenmaal per taak. Helaas biedt mclapply geen mechanisme voor het initialiseren van de werkers voordat taken worden uitgevoerd, dus het is niet eenvoudig om dit te doen met de doMC-backend, maar als u de doParallel-backend gebruikt, kunt u de werkers initialiseren met clusterEvalQ. Hier is een voorbeeld van hoe de code te herstructureren:

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

Aangezien doParallel en clusterEvalQ hetzelfde clusterobject gebruiken cl , heeft de foreach-lus toegang tot het databaseverbindingsobject con bij het uitvoeren van de taken.



  1. Hoe SUBSTRING() werkt in MariaDB

  2. Waarom kan ik geen kolomaliassen gebruiken in de volgende SELECT-expressie?

  3. Een cluster-naar-cluster-replicatie configureren voor Percona XtraDB-cluster of MariaDB-cluster

  4. SQL-operators