sql >> Databáze >  >> RDS >> PostgreSQL

foreach %dopar% + RPostgreSQL

Je efektivnější vytvořit připojení k databázi jednou na pracovníka, než jednou na úlohu. Bohužel mclapply neposkytuje mechanismus pro inicializaci pracovníků před provedením úloh, takže to není snadné udělat pomocí backendu doMC, ale pokud používáte backend doParallel, můžete inicializovat pracovníky pomocí clusterEvalQ. Zde je příklad, jak restrukturalizovat kód:

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

Protože doParallel a clusterEvalQ používají stejný objekt clusteru cl , smyčka foreach bude mít přístup k objektu připojení k databázi con při provádění úkolů.



  1. Použití LogMiner k nalezení aktuálních změn

  2. Android JDBC nefunguje:ClassNotFoundException v ovladači

  3. Udělte oprávnění uživateli MySQL v systému Linux prostřednictvím příkazového řádku

  4. Nějaké nevýhody bitových příznaků ve sloupcích databáze?