में एसक्यूएल प्रश्नों का समानांतरकरण मेरे पास छह एसक्यूएल प्रश्न हैं जो मैं स्क्रिप्ट करता हूं हालांकि आर प्रत्येक में बहुत लंबा समय लगता है (~ 30 मिनट प्रत्येक)। एक बार प्रत्येक क्वेरी लौटने के बाद मैं कुछ मानक रिपोर्ट के लिए डेटा में हेरफेर करता हूं।आर
मैं क्या करना चाहते हैं क्या मेरी मल्टीकोर मशीन का उपयोग एक Windows मशीन एक Oracle DB के साथ पर आर
मैं से समानांतर में इन एसक्यूएल अनुरोध को चलाने के लिए है। मैं इन अनुरोधों को आजमाने और विभाजित करने के लिए doSNOW और foreach का उपयोग करने के लिए blog post का पालन कर रहा था और यह सबसे अच्छी बात है जिसे मैं stackoverflow पर पा सकता हूं।
मैं प्रक्रिया के गैर-समांतर%%% संस्करण के लिए काम करने की प्रक्रिया प्राप्त करने में सक्षम हूं लेकिन% dopar% नहीं। % Dopar% के साथ यह सिर्फ एक खाली सेट देता है। नीचे कोड है जो टेबल सेट करता है और क्वेरी चलाता है ताकि आप देख सकें कि क्या होता है। यदि बहुत अधिक बुनियादी कोड है तो अग्रिम में क्षमा करें।
मैंने कुछ अन्य आर पैकेजों को देखा है लेकिन एक स्पष्ट समाधान नहीं देखा है। इसके अलावा यदि आपके पास इस तरह की प्रक्रिया को प्रबंधित करने का एक बेहतर तरीका है, तो मुझे यह सुनना होगा - बस ध्यान रखें कि मैं एक विश्लेषक हूं जो कंप्यूटर वैज्ञानिक नहीं है। धन्यवाद!
#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)
समानांतर में डेटाबेस का पता कर ही प्रक्रिया धीमा कर सकता है, क्या अड़चन खड़ी कर रहा है पर निर्भर करता है। क्या आप निश्चित हैं कि आपकी मशीन पर चलने वाला आर उदाहरण है, (डेटाबेस नहीं, नेटवर्क कनेक्शन, मशीन जिस पर डेटाबेस चल रहा है, इत्यादि)? –
क्या क्लस्टर नोड्स पर 'RODBC' पैकेज लोड किया गया है? यदि नहीं, तो अपने 'foreach()' कॉल में '.packages = "RODBC" 'जोड़ें। – BenBarnes
@ जोशुआ उलरिच - डेटाबेस बहुत मजबूत है क्योंकि यह एक वाणिज्यिक ओरेकल स्थापना है। प्रश्न केवल डेटाबेस में बहुत से प्रसंस्करण की आवश्यकता वाले कई तालिकाओं में शामिल होते हैं। मैन्युअल तरीका यह है कि मैं इसे गति दूंगा, एसक्यूएल डेवलपर से कई उदाहरण शुरू करना है, लेकिन एक आर स्क्रिप्ट मेरे लिए बहुत से पोस्ट क्वेरी प्रोसेसिंग करता है, इसलिए मैं आर को कई बार एक से अधिक प्रश्न पूछना चाहता हूं ताकि मैं सबसे लंबा समय सभी प्रश्नों को एक साथ जोड़ने के बजाय लंबे समय तक प्रतीक्षा करना है। –