Det är mer effektivt att skapa databasanslutningen en gång per arbetare, snarare än en gång per uppgift. Tyvärr tillhandahåller mclapply ingen mekanism för att initiera arbetarna innan de utför uppgifter, så det är inte lätt att göra detta med doMC-backend, men om du använder doParallel-backend kan du initiera arbetarna med clusterEvalQ. Här är ett exempel på hur du strukturerar om koden:
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)
})
Eftersom doParallel och clusterEvalQ använder samma klusterobjekt cl
, kommer foreach loop att ha tillgång till databasanslutningsobjektet con
när du utför uppgifterna.