Mēģinot izmantot vairākas ODBC savienojumus visā parallelized darba pavedienu var neizdoties, kā redzams šajā piemērā:
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"
Problēma ir darba procesu ODBC savienojumu kā slēgts saņemšanai.
Problēma šeit ir savienojumi specifisko procesu, tā darbinieki koplieto galvenais process (kā tas ir izveidots, izmantojot forking funkcijas daudzkodolu darbinieki), ja galvenā savienojumu nevar koplietot darbiniekiem. Izplatīt ODBC aprēķini-žuburains darbiniekiem, izveidot savienojumus uz katra darbinieka dalītā uzdevumu ietvaros.
Piemērs:
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')})