2015-02-24 13 views
5

मैं अपने विंडोज मशीन पर समानांतर में predict() चलाने की कोशिश कर रहा हूं। यह छोटे डेटासेट पर काम करता है, लेकिन अच्छी तरह से स्केल नहीं करता है क्योंकि प्रत्येक प्रक्रिया के लिए डेटा फ्रेम की नई प्रति बनाई जाती है। अस्थायी प्रतियों के बिना समानांतर में कैसे चलाना है?समांतर भविष्यवाणी

मेरे कोड (केवल कुछ this मूल कोड के संशोधन):

library(foreach) 
library(doSNOW) 

fit <- lm(Employed ~ ., data = longley) 
scale <- 100 
longley2 <- (longley[rep(seq(nrow(longley)), scale), ]) 

num_splits <-4 
cl <- makeCluster(num_splits) 
registerDoSNOW(cl) 

split_testing<-sort(rank(1:nrow(longley))%%num_splits) 

predictions<-foreach(i= unique(split_testing), 
        .combine = c, .packages=c("stats")) %dopar% { 
         predict(fit, newdata=longley2[split_testing == i, ]) 
        } 
stopCluster(cl) 

मैं सरल डेटा प्रतिकृति का उपयोग कर रहा यह परीक्षण करने के लिए। scale 10 या 1000 के साथ यह काम कर रहा है, लेकिन मैं इसे scale <- 1000000 के साथ चलाऊंगा - 16 एम पंक्तियों के साथ डेटा फ्रेम (द्वारा द्वारा pryr से संकेतित किया गया है। ध्यान दें कि जब आवश्यक हो तो मैं लिनक्स मशीन का भी उपयोग कर सकता हूं, अगर यह एकमात्र विकल्प है

उत्तर

6

आप itertools पैकेज से isplitRows समारोह का उपयोग कर सकते केवल longley2 के अंश उस कार्य के लिए आवश्यक है भेजने के लिए:।

library(itertools) 

predictions <- 
    foreach(d=isplitRows(longley2, chunks=num_splits), 
      .combine=c, .packages=c("stats")) %dopar% { 
    predict(fit, newdata=d) 
    } 

यह स्वचालित रूप से किया जा रहा से पूरे longley2 डेटा फ्रेम से बचाता है प्रत्येक श्रमिक को निर्यात किया जाता है और इसे सरल बनाता है थोड़ा सा कोड