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ů.