מנסה להשתמש בחיבורים מרובים של ODBC על-פני להליכי עבודה parallelized עלול להיכשל כמו בדוגמה הבאה:
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"
הבעיה היא שתהליכי העובד לקבל חיבורים ODBC כסגורה.
הבעיה כאן היא חיבורי הם תהליך ספציפי, כך אלא אם כן עובדי משתף את תהליך האב (כמו עובדי multicore שנוצרו באמצעות ההסתעפות), ניתן לשתף התקשרויות האב על-ידי עובדים. להפצת חישובים ODBC ב- forked לעבודה, ליצור את החיבורים על כל עובד כחלק פעילות מבוזרת.
דוגמה:
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')})