आर

2012-03-29 11 views
14

में एसक्यूएल प्रश्नों का समानांतरकरण मेरे पास छह एसक्यूएल प्रश्न हैं जो मैं स्क्रिप्ट करता हूं हालांकि आर प्रत्येक में बहुत लंबा समय लगता है (~ 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) 
+2

समानांतर में डेटाबेस का पता कर ही प्रक्रिया धीमा कर सकता है, क्या अड़चन खड़ी कर रहा है पर निर्भर करता है। क्या आप निश्चित हैं कि आपकी मशीन पर चलने वाला आर उदाहरण है, (डेटाबेस नहीं, नेटवर्क कनेक्शन, मशीन जिस पर डेटाबेस चल रहा है, इत्यादि)? –

+0

क्या क्लस्टर नोड्स पर 'RODBC' पैकेज लोड किया गया है? यदि नहीं, तो अपने 'foreach()' कॉल में '.packages = "RODBC" 'जोड़ें। – BenBarnes

+0

@ जोशुआ उलरिच - डेटाबेस बहुत मजबूत है क्योंकि यह एक वाणिज्यिक ओरेकल स्थापना है। प्रश्न केवल डेटाबेस में बहुत से प्रसंस्करण की आवश्यकता वाले कई तालिकाओं में शामिल होते हैं। मैन्युअल तरीका यह है कि मैं इसे गति दूंगा, एसक्यूएल डेवलपर से कई उदाहरण शुरू करना है, लेकिन एक आर स्क्रिप्ट मेरे लिए बहुत से पोस्ट क्वेरी प्रोसेसिंग करता है, इसलिए मैं आर को कई बार एक से अधिक प्रश्न पूछना चाहता हूं ताकि मैं सबसे लंबा समय सभी प्रश्नों को एक साथ जोड़ने के बजाय लंबे समय तक प्रतीक्षा करना है। –

उत्तर

9

जब आप काम outputPar[i] = result धारावाहिक foreach पाश अंदर बनाने के लिए, यह ठीक है (लेकिन foreach की वास्तव में नहीं इच्छित उपयोग)। जब आप समांतर लूप में यह असाइनमेंट करते हैं, तो यह ठीक नहीं है। क्रांति पर डेविड स्मिथ द्वारा दिए गए एक समान प्रश्न के लिए http://tolstoy.newcastle.edu.au/R/e10/help/10/04/3237.html देखें।

एक समाधान के रूप में,

system.time(
    outputPar <- foreach(i = 1:2, .packages="RODBC")%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])) 
    result 
} 
) 
+1

बहुत अच्छा - मैंने इस तरह% dopar% कोड को संशोधित किया और यह काम किया। आपकी इतनी मदद के लिए आपका धन्यवाद दोस्तों। 'system.time ( परीक्षण <- foreach (i = 1: 2, .packages =" RODBC ")% dopar% { # RODBC ch = odbcConnect (dsn, pwd =" xxxxxxx ", believeNRows = के माध्यम से डेटाबेस से कनेक्ट करना FALSE) #Test कनेक्शन odbcGetInfo (ch) sqlQuery (ch, पेस्ट ('से चयन *', डेटाबेस [i])) } ) test' –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^