Gebruik meerdere ODBC-verbindingen via parallelized worker-threads kunnen niet lukken zoals in het volgende voorbeeld:
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"
Het probleem is dat de werkprocessen wordt de ODBC-verbindingen afgesloten.
Het probleem hier is dat verbindingen specifiek voor een proces, zijn dus tenzij het bovenliggende proces (zoals in multicore werknemers gemaakt via een vertakking) zijn delen van de werknemers van de bovenliggende verbindingen kunnen niet worden gedeeld door de werknemers. Om ODBC-berekeningen van werknemers niet forked verdelen, tot stand brengen de verbindingen op elke werknemer als onderdeel van de gedistribueerde taak. Voorbeeld: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')})