Ενδέχεται να μην προσπαθήσετε να χρησιμοποιήσετε πολλαπλές συνδέσεις 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 που έκλεισε.
Το ζήτημα εδώ είναι ότι οι συνδέσεις είναι συγκεκριμένη διαδικασία, έτσι εκτός αν οι εργαζόμενοι κοινή χρήση τη γονική διεργασία (όπως μέσω διχασμών πολλαπλών πυρήνων εργαζομένων), συνδέσεων της γονικής τοποθεσίας δεν είναι δυνατό να επιμερίζονται στους εργαζομένους. Για να διανείμετε 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')})