Mencoba untuk menggunakan beberapa ODBC sambungan di seluruh thread pekerja pesawat yang diparalelkan mungkin gagal seperti dalam contoh berikut:
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"
Masalahnya adalah proses pengerjaan menerima koneksi ODBC sebagai tertutup.
Masalah di sini adalah bahwa sambungan proses khusus, jadi kecuali pekerja berbagi proses induk (seperti multicore pekerja dibuat melalui forking), folder induk sambungan tidak dapat dibagi dengan pekerja. Untuk mendistribusikan ODBC perhitungan pekerja non-bercabang, membuat sambungan pada setiap pekerja sebagai bagian dari tugas terdistribusi.
Contoh:
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')})