Al intentar utilizar varias conexiones ODBC a través de subprocesos de trabajo paralelizada puede fallar como en el ejemplo siguiente:
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"
El problema es que los procesos de trabajo reciben las conexiones ODBC como cerrado.
El problema aquí es que las conexiones son específicos del proceso, por lo que a menos que los trabajadores están compartiendo el proceso padre (como en trabajadores multicore creado a través del que se bifurcan), las conexiones del primario no se puede compartir por los trabajadores. Para distribuir los cálculos de ODBC en trabajadores no bifurcado, establecer las conexiones en cada trabajador como parte de la tarea distribuida.
Ejemplo:
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')})