2012-06-08 37 views
12

कई प्रयासों के लिए मैं इस समय शामिल हूं, मैं कार्यों की एक श्रृंखला के माध्यम से कई पैरामीटर संयोजनों के साथ बड़े डेटासेट चला रहा हूं। क्लस्टर पर ऑपरेशन की आसानी के लिए फ़ंक्शंस में एक रैपर होता है (इसलिए मैं mclapply कर सकता हूं)। हालांकि, मैं दो प्रमुख चुनौतियों में भाग लेता हूं।जब कोई सूची आइटम विफल रहता है या बहुत लंबा लगता है तो मैं एक लापरवाही से कैसे समय निकाल सकता हूं?

ए) मेरे पैरामीटर संयोजन बड़े हैं (20k से 100k सोचें)। कभी-कभी विशेष संयोजन असफल हो जाएंगे (उदा। अस्तित्व बहुत अधिक है और मृत्यु दर बहुत कम है इसलिए मॉडल कभी भी एक अनुमानित परिदृश्य के रूप में परिवर्तित नहीं होता है)। मेरे लिए समय से पहले बाहर निकलना मुश्किल है कि कौन से संयोजन असफल हो जाएंगे (अगर मैं ऐसा कर सकता तो जीवन आसान होगा)। लेकिन अब के लिए मैं इस प्रकार के सेटअप है: मेरे आवरण समारोह के लिए

failsafe <- failwith(NULL, my_wrapper_function) 
# This is what I run 
# Note that input_variables contains a list of variables in each list item 
results <- mclapply(input_variables, failsafe, mc.cores = 72) 
# On my local dual core mac, I can't do this so the equivalent would be: 
results <- llply(input_variables, failsafe, .progress = 'text') 

कंकाल इस तरह दिखता है:

my_wrapper_function <- function(tlist) { 
    run <- tryCatch(my_model(tlist$a, tlist$b, tlist$sA, tlist$Fec, m = NULL) , error=function(e) NULL) 
... 
return(run) 
} 

इस सबसे कुशल दृष्टिकोण है? अगर किसी कारण से चर के एक विशेष संयोजन मॉडल को दुर्घटनाग्रस्त कर देता है, तो मुझे इसे NULL वापस करने और बाकी के साथ आगे बढ़ने की आवश्यकता है। हालांकि, मुझे अभी भी समस्याएं हैं कि यह कृपा से कम विफल हो जाती है।

बी) कभी-कभी इनपुट का एक निश्चित संयोजन मॉडल को क्रैश नहीं करता है लेकिन अभिसरण करने में बहुत लंबा समय लगता है। मैंने अपने क्लस्टर पर गणना समय पर एक सीमा निर्धारित की है (6 घंटे कहें) इसलिए मैं अपने संसाधनों को फंसे कुछ पर बर्बाद नहीं करता हूं। मैं एक टाइमआउट कैसे शामिल कर सकता हूं जैसे कि एक फ़ंक्शन कॉल को एक ही सूची आइटम पर x समय से अधिक समय लगता है, तो इसे आगे बढ़ना चाहिए? बिताए गए समय की गणना करना मामूली है लेकिन समय की जांच करने के लिए एक समारोह मध्य सिमुलेशन बाधित नहीं किया जा सकता है, है ना?

कोई विचार, समाधान या चाल की सराहना की जाती है!

+1

क्या आपने setTimeLimit() या http://www.inside-r.org/node/81211 में देखा है? हो सकता है कि आपको क्या चाहिए। – frankc

उत्तर

12

R.utils पैकेज से tryCatch() और evalWithTimeout() के संयोजन का उपयोग करके आप सुंदर-बाहर-ऑन-टाइमआउट प्रबंधित करने में सक्षम हो सकते हैं। See also this post, जो समान कोड और प्रस्तुत करता है, इसे थोड़ा और विस्तार से अनपैक करता है।

require(R.utils) 

myFun <- function(x) {Sys.sleep(x); x^2} 

## evalWithTimeout() times out evaluation after 3.1 seconds, and then 
## tryCatch() handles the resulting error (of class "TimeoutException") with 
## grace and aplomb. 
myWrapperFunction <- function(i) { 
    tryCatch(expr = evalWithTimeout(myFun(i), timeout = 3.1), 
      TimeoutException = function(ex) "TimedOut") 
} 

sapply(1:5, myWrapperFunction) 
# [1] "1"  "4"  "9"  "TimedOut" "TimedOut" 
+0

आपको बहुत धन्यवाद जोश। मैं अब अपने क्लस्टर पर इसका परीक्षण कर रहा हूं (स्थानीय रूप से ठीक काम करता है लेकिन यह सुनिश्चित नहीं है कि टाइमआउट एक क्लस्टर पर अच्छी तरह से खेलता है)। – Maiasaura