タスクごとに1回ではなく、ワーカーごとに1回データベース接続を作成する方が効率的です。残念ながら、mclapplyはタスクを実行する前にワーカーを初期化するメカニズムを提供しないため、doMCバックエンドを使用してこれを行うのは簡単ではありませんが、doParallelバックエンドを使用する場合は、clusterEvalQを使用してワーカーを初期化できます。コードを再構築する方法の例を次に示します。
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とclusterEvalQは同じクラスターオブジェクトcl
を使用しているため 、foreachループはデータベース接続オブジェクトcon
にアクセスできます タスクを実行するとき。