Estou tentando processar cerca de 30 mil códigos/registros de um banco de dados em paralelo no R usando os pacotes doParallel e foreach. Já fiz isso em outros aplicativos usando um banco de dados SQLite e um banco de dados SQL Server. O banco de dados que estou tentando usar agora é o MariaDB e ele está sendo executado localmente no meu computador com Windows 11. No entanto, durante o loop, cerca de 3.500 das tentativas de conexão com o banco de dados falham. A falha ocorre ao executar a função "dbConnect". Esta é a mensagem de erro:
Falha na conexão: Não é possível conectar ao servidor em 'localhost' (10048)
library(data.table)
library(foreach)
library(RMariaDB)
library(doParallel)
cl<-makeCluster(6)
registerDoParallel(cl)
results <- foreach(i=1:length(cds),.packages=c('data.table','RMariaDB'),.errorhandling="pass") %dopar% {
dbCon <- dbConnect(RMariaDB::MariaDB(), user=dbuser, password=dbpwd, dbname=databasename)
#run queries, do calculations, etc.
dbDisconnect(dbCon)
return(dtset)
}
stopCluster(cl)
Posso adicionar um TryCatch que pausa por alguns segundos após uma falha antes de tentar novamente, e ele será concluído sem erros.
library(data.table)
library(foreach)
library(RMariaDB)
library(doParallel)
cl<-makeCluster(6)
registerDoParallel(cl)
results <- foreach(i=1:length(cds),.packages=c('data.table','RMariaDB'),.errorhandling="pass") %dopar% {
j <- 0
cont <- TRUE
while(cont==TRUE) {
fRet <- tryCatch({
dbCon <- dbConnect(RMariaDB::MariaDB(), user=dbuser, password=dbpwd, dbname=databasename)
iRet <- 0
},
error = function(err) {
return(err)
})
if("error" %in% class(fRet) & j<5) {
Sys.sleep(1 + 3*j)
j <- j + 1
} else {
cont <- FALSE
}
}
#run queries, do calculations, etc.
dbDisconnect(dbCon)
return(dtset)
}
stopCluster(cl)
A solução TryCatch funciona temporariamente (retarda a execução), mas deve haver uma maneira melhor. Há alguma configuração que precise ser ajustada no banco de dados?
- max_connections está definido como 150, então não acho que seja esse o problema. (Há uma mensagem de erro diferente que é retornada quando excedo o máximo de conexões.)
- Também tentei ajustar thread_pool_size de 32 para 64 e isso não ajudou.
- Tenho uma CPU de 16 núcleos (32 threads) e 128 GB de RAM, então duvido que seja esse o problema. Recebo o mesmo número de erros independentemente de executar usando 24 núcleos ou algo como 2 ou 4. Se eu executar o código usando "%do%" em vez de "%dopar%", de modo que ele use apenas 1 núcleo e não seja executado em paralelo, ele será concluído sem erros.
Qualquer ajuda será apreciada!