Încearcă să utilizeze mai multe conexiuni ODBC peste fire paralelizate lucrător poate să nu reușească ca în exemplul următor:
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"
Problema este procese de lucru primi conexiuni ODBC închise.
Problema aici este că conexiuni sunt specifice procesului, astfel încât dacă lucrători partajaţi procesul părinte (ca în multi-core lucrători creat prin bifurcare), conexiunile părinte nu poate fi partajat de lucrători. Pentru a distribui ODBC calcule non-incarcatori ilor, stabili conexiuni de pe fiecare lucrător ca parte a activității distribuite.
Exemplu:
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')})