Cố gắng sử dụng nhiều ODBC kết nối qua chủ đề riêng biệt parallelized có thể không thành công như trong ví dụ sau:
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"
Vấn đề là trình riêng biệt được kết nối ODBC khi đóng.
Vấn đề ở đây là kết nối trình cụ thể, do đó, trừ khi các chương trình chia sẻ trình cha (như chương trình đa lõi tạo qua forking), kết nối của phụ huynh không được chia sẻ các chương trình. Để cung cấp ODBC tính toán trên không chia hai chương trình, thiết lập kết nối trên mỗi công nhân là một phần của việc phân phối. Ví dụ: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')})