Я пытаюсь выполнить запрос к моей БД большое количество раз и активировать некоторую логику в наборе результатов запроса.
Для этого я использую Roracle
и dopar
(Кстати, моя первая попытка была с RJDBC
, но я переключился на Roracle
, потому что получил Ошибка чтения из соединения; Сейчас Я больше не получаю эту ошибку, но у меня есть проблема, описанная ниже).
Проблема в том, что большая часть процесса умирает (превращается в зомби) во время параллельного сеанса. Я наблюдаю за этим с помощью команды top
над моей системой Linux; файл журнала, который показывает мне прогресс моего параллельного цикла; и мониторинг моей БД во время сеанса. Когда я запускаю программу, я вижу, что рабочие загружены, и программа прогрессирует с высокой скоростью, но затем большинство из них умирает, и программа становится медленной (или вообще не работает) без сообщения об ошибке.
Вот пример кода того, что я пытаюсь сделать:
library(doParallel)
library(Roracle)
temp <- function(i) {
# because you can't get access to my DB, it's irrelevant to file the following rows(where I put three dots)- But I checked my DB connection and it works fine.
drv <- ...
host <- ...
port <- ...
sid <- ...
connect.string <- paste(...)
conn_oracle <- dbConnect(drv, username=..., password=..., dbname=connect.string)
myData <- dbGetQuery(conn_oracle, sprintf("SELECT '%s%' FROM dual", i))
print(i)
dbDisconnect(conn_oracle)
}
cl <- makeCluster(10, outfile = "par_log.txt")
registerDoParallel(cl)
output <- foreach(i=1:100000, .inorder=T, .verbose=T, .combine='rbind',
.packages=c('Roracle'),
.export=c('temp'))
%dopar% {temp(i)}
stopCluster(cl)
Любая помощь будет оценена!