प्रति कार्य एक बार के बजाय, प्रति कार्यकर्ता एक बार डेटाबेस कनेक्शन बनाना अधिक कुशल है। दुर्भाग्य से, mclapply कार्यों को निष्पादित करने से पहले श्रमिकों को प्रारंभ करने के लिए एक तंत्र प्रदान नहीं करता है, इसलिए doMC बैकएंड का उपयोग करके ऐसा करना आसान नहीं है, लेकिन यदि आप doParallel बैकएंड का उपयोग करते हैं, तो आप क्लस्टरइवलक्यू का उपयोग करके श्रमिकों को प्रारंभ कर सकते हैं। कोड को पुन:व्यवस्थित करने का एक उदाहरण यहां दिया गया है:
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)
})
चूंकि doParallel और क्लस्टरEvalQ एक ही क्लस्टर ऑब्जेक्ट का उपयोग कर रहे हैं cl
, फ़ोरैच लूप के पास डेटाबेस कनेक्शन ऑब्जेक्ट तक पहुंच होगी con
कार्यों को निष्पादित करते समय।