Lebih efisien untuk membuat koneksi database sekali per pekerja, daripada sekali per tugas. Sayangnya, mclapply tidak menyediakan mekanisme untuk menginisialisasi pekerja sebelum menjalankan tugas, jadi tidak mudah untuk melakukan ini menggunakan backend doMC, tetapi jika Anda menggunakan backend doParallel, Anda dapat menginisialisasi pekerja menggunakan clusterEvalQ. Berikut ini contoh cara menyusun ulang kode:
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)
})
Karena doParallel dan clusterEvalQ menggunakan objek cluster yang sama cl
, loop foreach akan memiliki akses ke objek koneksi database con
saat menjalankan tugas.