Tentativa de usar várias conexões ODBC através de segmentos de trabalho paralelizados pode falhar como no seguinte exemplo:
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"
O problema é que os processos de trabalho recebem as conexões ODBC como fechada.
O problema aqui é que conexões são específicas do processo, então, a menos que os trabalhadores estão compartilhando o processo pai (como trabalhadores com vários núcleos criadas por meio de bifurcação), conexões do pai não podem ser compartilhados pelos trabalhadores. Para distribuir computações de ODBC não bifurcada trabalhadores, estabelece conexões em cada trabalhador como parte de tarefas distribuídas. Exemplo: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')})