Sẽ hiệu quả hơn nếu tạo kết nối cơ sở dữ liệu một lần cho mỗi nhân viên, thay vì một lần cho mỗi tác vụ. Thật không may, mclapply không cung cấp cơ chế khởi tạo các worker trước khi thực thi các tác vụ, vì vậy không dễ thực hiện việc này bằng cách sử dụng doMC backend, nhưng nếu bạn sử dụng doParallel backend, bạn có thể khởi tạo worker bằng cách sử dụng clusterEvalQ. Dưới đây là một ví dụ về cách cấu trúc lại mã:
Thư việnlibrary(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)
})
Vì doParallel và clusterEvalQ đang sử dụng cùng một đối tượng cụm cl
, vòng lặp foreach sẽ có quyền truy cập vào đối tượng kết nối cơ sở dữ liệu con
khi thực hiện các nhiệm vụ.