A tentar utilizar várias ligações de ODBC através de threads de trabalho parallelized poderá falhar como no exemplo seguinte:
loaddata <- function(cn){
result <- sqlQuery(cn,'select * from boston')
return(head(result))
}
library(RODBC)
cn1 <- odbcConnect("RevoTestDB", uid='RevoTester', pwd='RevoTester')
cn2 <- odbcConnect("RevoTestDB", uid='RevoTester', pwd='RevoTester')
cn3 <- odbcConnect("RevoTestDB", uid='RevoTester', pwd='RevoTester')
cn4 <- odbcConnect("RevoTestDB", uid='RevoTester', pwd='RevoTester')
rxSetComputeContext('localpar')
system.time ({
z <- rxExec(loaddata, rxElemArg(list(cn1,cn2,cn3,cn4)),
packagesToLoad='RODBC')
})
Error in do.call(.rxDoParFUN, as.list(args)) :
task 1 failed - "first argument is not an open RODBC channel"
O problema é que os processos de trabalho recebem as ligações ODBC como fechadas.
O problema aqui é que as ligações são específicas do processo, por isso, a menos que os trabalhadores estiverem a partilhar o processo principal (como trabalhadores multicore criado através da bifurcação), as ligações da empresa-mãe não podem ser partilhadas pelos trabalhadores. Para distribuir os cálculos de ODBC no não forked dos trabalhadores, estabelecer as ligações de cada trabalhador como parte da tarefa distribuída.
Exemplo:
loaddata <- function(){library(RODBC)
cn <- odbcConnect("RevoTestDB", uid='RevoTester', pwd='RevoTester')
result <- sqlQuery(cn,'select * from boston')
return(head(result))
}
z <- system.time({z <- rxExec(loaddata,
packagesToLoad='RODBC')})