sql >> データベース >  >> RDS >> PostgreSQL

foreach%dopar%+ RPostgreSQL

    タスクごとに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にアクセスできます タスクを実行するとき。



    1. MariaDBの日付から月を返す4つの関数

    2. WindowsにPostgreSQL用のクライアントツールだけをインストールするにはどうすればよいですか?

    3. MySQLDBの列名のハイフン

    4. クライアントPCでのLocalDBの展開