मेरे पास कई पंक्तियां हैं और प्रत्येक पंक्ति पर मैं एक गैर-रैखिक फ़ंक्शन के अनियूट की गणना करता हूं। मेरे पास क्वाड-कोर उबंटू मशीन है जिसने मेरे कोड को दो दिनों के लिए नहीं चलाना बंद कर दिया है। आश्चर्य की बात नहीं है, मैं चीजों को गति देने के तरीकों की तलाश में हूं ;-)क्या मैप्ली समानांतर करने का कोई प्रभावी तरीका है?
कुछ शोध के बाद, मैंने देखा कि वर्तमान में केवल एक कोर का उपयोग किया जाता है और समांतरता करना ही काम है। गहराई से खोना, मैं निष्कर्ष पर आया (शायद गलत तरीके से?) कि पैकेज foreach
वास्तव में मेरी समस्या के लिए नहीं है क्योंकि बहुत अधिक ओवरहेड का उत्पादन होता है (उदाहरण के लिए, SO)। यूनिक्स मशीनों के लिए एक अच्छा विकल्प multicore
लगता है। विशेष रूप से, सहायता पृष्ठ की जांच करने के बाद pvec
फ़ंक्शन सबसे प्रभावी लगता है।
हालांकि, अगर मैं इसे सही ढंग से समझता हूं, तो यह फ़ंक्शन केवल एक वेक्टर लेता है और तदनुसार इसे विभाजित करता है। मुझे एक फ़ंक्शन की आवश्यकता है जिसे लंबित किया जा सकता है, लेकिन एकाधिक वैक्टर (या data.frame
इसके बजाय) लेता है, जैसे कि mapply
फ़ंक्शन करता है। क्या वहां कुछ भी है जो मुझे याद आया?
यहां एक छोटा सा उदाहरण है जो मैं करना चाहता हूं: (ध्यान दें कि इसमें plyr
उदाहरण शामिल है क्योंकि यह mapply
फ़ंक्शन के आधार का विकल्प हो सकता है और इसमें समानांतर विकल्प है। हालांकि, यह मेरे धीमे है कार्यान्वयन और आंतरिक रूप से, यह foreach
कॉल parallelize करने, इसलिए मुझे लगता है कि यह मदद नहीं करेगा। वह सही है?)
library(plyr)
library(foreach)
n <- 10000
df <- data.frame(P = rnorm(n, mean=100, sd=10),
B0 = rnorm(n, mean=40, sd=5),
CF1 = rnorm(n, mean=30, sd=10),
CF2 = rnorm(n, mean=30, sd=5),
CF3 = rnorm(n, mean=90, sd=8))
get_uniroot <- function(P, B0, CF1, CF2, CF3) {
uniroot(function(x) {-P + B0 + CF1/x + CF2/x^2 + CF3/x^3},
lower = 1,
upper = 10,
tol = 0.00001)$root
}
system.time(x1 <- mapply(get_uniroot, df$P, df$B0, df$CF1, df$CF2, df$CF3))
#user system elapsed
#0.91 0.00 0.90
system.time(x2 <- mdply(df, get_uniroot))
#user system elapsed
#5.85 0.00 5.85
system.time(x3 <- foreach(P=df$P, B0=df$B0, CF1=df$CF1, CF2=df$CF2, CF3=df$CF3, .combine = "c") %do% {
get_uniroot(P, B0, CF1, CF2, CF3)})
#user system elapsed
# 10.30 0.00 10.36
all.equal(x1, x2$V1) #TRUE
all.equal(x1, x3) #TRUE
इसके अलावा, मैं ऊपर अतः लिंक से chunkapply रयान थॉम्पसन के समारोह को लागू करने की कोशिश की (केवल छुटकारा मिल गया doMC
भाग का, क्योंकि मैं इसे इंस्टॉल नहीं कर सका। उसका उदाहरण काम करता है, हालांकि, अपने फ़ंक्शन को समायोजित करने के बाद भी।), लेकिन नहीं किया इसे काम करने के लिए नहीं मिलता है। हालांकि, चूंकि यह foreach
का उपयोग करता है, मैंने सोचा कि ऊपर वर्णित वही तर्क लागू होते हैं, इसलिए मैंने इसे बहुत लंबा प्रयास नहीं किया।
#chunkapply(get_uniroot, list(P=df$P, B0=df$B0, CF1=df$CF1, CF2=df$CF2, CF3=df$CF3))
#Error in { : task 1 failed - "invalid function value in 'zeroin'"
पुनश्च: मैं जानता हूँ कि मैं सिर्फ बढ़ सकते हैं tol
चरण हैं, जो एक uniroot लगाने के लिए आवश्यक हैं की संख्या को कम करने के लिए। हालांकि, मैंने पहले से ही tol
जितना संभव हो उतना बड़ा सेट किया है।
महान स्पष्टीकरण और उदाहरण के लिए धन्यवाद। यह वही है जिसे मैं देख रहा था। साथ ही, मुझे पता नहीं था कि 'समानांतर' R2.14.0 से उपलब्ध था, यह भी जानना अच्छा है। –
आपका स्वागत है। इससे पहले कि आप इसे निश्चित रूप से उपयोग कर सकें, समानांतर अभी भी लोड किया जाना चाहिए, लेकिन यह मानक स्थापना के साथ आता है। –