Tôi có sáu truy vấn SQL mà tôi kịch bản mặc dù R mà mỗi lần mất một thời gian rất dài (~ 30 phút mỗi). Khi mỗi truy vấn trả về, tôi sẽ thao tác dữ liệu cho một số báo cáo chuẩn.Song song các truy vấn SQL trong R
Những gì tôi muốn làm là sử dụng máy đa lõi của tôi để chạy các yêu cầu SQL song song từ R.
Tôi đang trên một máy tính Windows với Oracle DB. Tôi đã theo dõi blog post để sử dụng doSNOW và foreach để thử và tách các yêu cầu này và đây là điều tốt nhất tôi có thể tìm thấy trên stackoverflow.
Tôi đã có thể làm cho quy trình hoạt động đối với phiên bản ngoại trừ% do% không làm song song nhưng không phải% dopar%. Với% dopar% nó chỉ trả về một tập rỗng. Dưới đây là mã thiết lập bảng và chạy các truy vấn để bạn có thể thấy điều gì xảy ra. Xin lỗi trước nếu có quá nhiều mã cơ bản.
Tôi đã xem xét một số gói R khác nhưng không thấy giải pháp rõ ràng. Ngoài ra nếu bạn có một cách tốt hơn để quản lý loại quy trình này, tôi muốn được quan tâm để nghe nó - chỉ cần ghi nhớ tôi là một nhà phân tích không phải là một nhà khoa học máy tính. Cảm ơn!
#Creating a cluster
library(doSNOW)
cl <- makeCluster(c("localhost","localhost"), type = "SOCK")
registerDoSNOW(cl)
#Connecting to database through RODBC
ch=odbcConnect("",pwd = "xxxxx", believeNRows=FALSE)
#Test connection
odbcGetInfo(ch)
#Creating database tables for example purposes
qryA1 <- "create table temptable(test int)"
qryA2 <- "insert into temptable(test) values((1))"
qryA3 <- "select * from temptable"
qryA4 <- "drop table temptable"
qryB1 <- "create table temptable2(test int)"
qryB2 <- "insert into temptable2(test) values((2))"
qryB3 <- "select * from temptable2"
qryB4 <- "drop table temptable2"
sqlQuery(ch, qryA1)
sqlQuery(ch, qryA2)
doesItWork <- sqlQuery(ch, qryA3)
doesItWork
sqlQuery(ch, qryB1)
sqlQuery(ch, qryB2)
doesItWork <- sqlQuery(ch, qryB3)
doesItWork
result = c()
output = c()
databases <- list('temptable','temptable2')
#Non-parallel version of foreach
system.time(
foreach(i = 1:2)%do%{
result<-sqlQuery(ch,paste('SELECT * FROM ',databases[i]))
output[i] = result
}
)
output
#Parallel version of foreach
outputPar = c()
system.time(
foreach(i = 1:2)%dopar%{
#Connecting to database through RODBC
ch=odbcConnect(dsn ,pwd = "xxxxxx", believeNRows=FALSE)
#Test connection
odbcGetInfo(ch)
result<-sqlQuery(ch,paste('SELECT * FROM ',databases[i]))
outputPar[i] = result
}
)
outputPar
sqlQuery(ch, qryA4)
sqlQuery(ch, qryB4)
Truy vấn cơ sở dữ liệu song song chỉ có thể làm cho quá trình chậm hơn, tùy thuộc vào những gì đang gây ra tắc nghẽn. Bạn có chắc chắn nút cổ chai là cá thể R chạy trên máy của bạn, (không phải cơ sở dữ liệu, kết nối mạng, máy cơ sở dữ liệu đang chạy trên, v.v.)? –
Gói 'RODBC' được tải trên các nút cụm sao? Nếu không, hãy thêm '.packages =" RODBC "' vào cuộc gọi 'foreach()' của bạn. – BenBarnes
@Joshua Ulrich - Cơ sở dữ liệu khá mạnh mẽ vì nó là một bản cài đặt Oracle thương mại. Các truy vấn chỉ tham gia trên nhiều bảng yêu cầu nhiều xử lý trong cơ sở dữ liệu. Cách thủ công mà tôi sẽ tăng tốc độ này là khởi tạo một vài trường hợp từ SQL Developer nhưng một tập lệnh R thực hiện rất nhiều xử lý truy vấn bài cho tôi vì vậy tôi muốn R khởi tạo nhiều truy vấn cùng một lúc để thời gian dài nhất mà tôi phải đợi là thời gian truy vấn dài thay vì thêm tất cả thời gian truy vấn cùng nhau. –