Dans le code parallèle à l’aide de connexions ODBC

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')})


Besoin d’aide ?

Développez vos compétences
Découvrez des formations
Accédez aux nouvelles fonctionnalités en avant-première
Rejoindre Microsoft Insider

Ces informations vous ont-elles été utiles ?

Nous vous remercions pour vos commentaires.

Merci pour vos commentaires. Il serait vraisemblablement utile pour vous de contacter l’un de nos agents du support Office.

×