PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

foreach %dopar% + RPostgreSQL

Bardziej wydajne jest tworzenie połączenia z bazą danych raz na pracownika, a nie raz na zadanie. Niestety mclapply nie zapewnia mechanizmu inicjowania pracowników przed wykonaniem zadań, więc nie jest to łatwe przy użyciu zaplecza doMC, ale jeśli używasz zaplecza doParallel, możesz zainicjować pracowników za pomocą clusterEvalQ. Oto przykład, jak zmienić strukturę kodu:

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)
})

Ponieważ doParallel i clusterEvalQ używają tego samego obiektu klastra cl , pętla foreach będzie miała dostęp do obiektu połączenia z bazą danych con podczas wykonywania zadań.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jakiego typu JOIN użyć

  2. Wstaw tekst z pojedynczymi cudzysłowami w PostgreSQL

  3. Dlaczego zapytanie nie zapisuje się w pliku csv, podczas gdy w konsoli postgresql wygląda to normalnie?

  4. Najlepsze narzędzia Open Source do migracji PostgreSQL

  5. Jak Now() działa w PostgreSQL