Essayez d’utiliser plusieurs connexions ODBC entre les threads de travail parallélisée peut échouer dans l’exemple suivant :
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"
Le problème est que les processus de travail reçoivent les connexions ODBC comme fermé.
Le problème ici est que les connexions sont spécifiques d’un processus, à moins que les travailleurs partagent le processus parent (comme travailleurs multicœurs créés à l’aide de fourche), les connexions du parent ne peut pas être partagées par les travailleurs. Pour distribuer les calculs de ODBC sur non dupliquée des travailleurs, établir les connexions sur chaque travailleur dans le cadre de la tâche distribuée.
Exemple :
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')})