PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

foreach %dopar% + RPostgreSQL

По-ефективно е да създадете връзката към базата данни веднъж на работник, а не веднъж на задача. За съжаление, 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изтеглите Postgres bytea колона като файл

  2. Как pgBouncer помага за ускоряване на Django

  3. Как работи функцията Degrees() в PostgreSQL

  4. Как да потърся нулеви стойности в json поле тип postgresql?

  5. PostgreSQL:Как да задам search_path на потребителско ниво?