2011-08-18 7 views
7

रुक गया है getYahooData()टीटीआर पैकेज में काफी तीव्रता से उपयोग कर रहा हूं।सभी कनेक्शन उपयोग में हैं: निष्पादन

मैं कोड के इस टुकड़े है:

for(i in 1:nrow(symbol)){ 
    tryCatch(prices <- getYahooData(symbol$symbol[i], from, to, freq="daily", 
            type="price"), 
      warning=function(e) continue <- 0) 
    if (continue==0) next 
} 

इस पाश लंबा है मैं इस त्रुटि मिलती है:

Error in file(file, "rt") : all connections are in use Calls: tryCatch ... doTryCatch -> getYahooData -> getYahooData -> read.table -> file Execution halted

मैं क्या कर सकता है?

अद्यतन:

तो मैं closeAllConnections() मैं का उपयोग करें:

I get: *** caught segfault *** address (nil), cause 'memory not mapped' Traceback: 1: getConnection(set[i]) 2: close(getConnection(set[i])) 3: closeAllConnections() aborting ... 
+2

मेरे सिस्टम पर गैर-पुनरुत्पादित। आपके द्वारा उपयोग किए जाने वाले प्रतीक वेक्टर क्या हैं? 'dput (प्रतीक) 'आज़माएं और हमें आउटपुट दें। –

+0

आपने इसे पुन: पेश कैसे किया? मैं इस समारोह का उपयोग लगभग 3000 शेयर मूल्य – Dail

+0

पहले डाउनलोड करने के लिए करता हूं, मैंने नहीं किया। जब तक मुझे पता चला कि मेरे पास कुछ त्रुटि और चेतावनी के साथ कुछ होना चाहिए। इसलिए मैंने आपकी समस्या हल की, लेकिन आपके द्वारा पोस्ट किए गए कोड के लिए आप कुछ गंभीर स्पैंकिंग के लायक हैं। ;) –

उत्तर

13

पहला: अपने जीवन के उपयोग में कभी भी न बनाएं जो फिर से निर्माण जारी रखें। इसका कोई उपयोग नहीं है। tryCatch() जारी रहेगा यदि आपने किसी त्रुटि या चेतावनी के लिए हैंडलर परिभाषित किया है। यह "डिफ़ॉल्ट" error=function(e) stop(e) के बजाय उस का उपयोग करेगा। यह आपके कार्य को रोक देगा। यदि आप एक हैंडलर (या तो warning= या error=) परिभाषित करते हैं, तो आपकी स्क्रिप्ट रोका नहीं जाएगा, ताकि जारी रखना आवश्यक न हो।

कहा गया है: इस मामले में tryCatch के सही उपयोग होगा:

for(i in 1:nrow(symbol)){ 

tryCatch(prices <- getYahooData(symbol$symbol[i], from, to, freq="daily", 
            type="price"), error = function(e){}) 

} 

या, यदि आप एक स्क्रिप्ट में इसका इस्तेमाल करते हैं और एक त्रुटि तब होती है जब अगले पाश में जाना चाहते हैं, तो आप बस कर सकते हैं उपयोग:

for(i in 1:nrow(symbol)){ 

    prices <- try(getYahooData(symbol$symbol[i], from, to, freq="daily", 
            type="price"), silent=TRUE) 

    if(inherits(prices,"try-error")) { next } # only true if an error occurs 
    ... # rest of calculations 
} 

आप tryCatch का इस तरह से इस्तेमाल किया है चाहते हैं या कोशिश करते हैं, क्या आप यहाँ रिपोर्ट समस्या नहीं पड़ता था।

अब मैं आपके मामले को पुन: उत्पन्न कर सकता हूं, अगर मैं बिना किसी प्रतीकात्मक प्रतीकों का उपयोग करता हूं। tryCatch() फ़ंक्शन का आपका गलत उपयोग आपको परेशानी का कारण बन रहा है। read.table एक त्रुटि देता है (Error in file(file, "rt") : cannot open the connection)। यह एक त्रुटि है, चेतावनी नहीं। आपको एक अतिरिक्त चेतावनी मिल रही है कि 404 फाइल नहीं मिली है।

जब किसी त्रुटि के साथ एक चेतावनी जारी की जाती है, तो चेतावनी के लिए हैंडलर फ़ंक्शन को पहले से निपटाया जाता है। ऐसा इसलिए है क्योंकि फ़ंक्शन को रोका जा सकता है इससे पहले एक चेतावनी फेंकनी पड़ती है। इसलिए यह आपके द्वारा प्राप्त त्रुटि को संभाल नहीं पाएगा, जिसका अर्थ है कि on.exit(close(file))read.table() में नहीं कहा जाएगा। इसलिए, कनेक्शन सही ढंग से बंद नहीं होता है और अभी भी खुला माना जाता है, हालांकि यह अब R (showAllConnections() कुछ भी नहीं दिखाता है) द्वारा नहीं पाया जा सकता है। चूंकि त्रुटि का सामना नहीं किया जाता है, कनेक्शन के पंजीकरण में कुछ गलत हो जाता है। चूंकि कनेक्शन खोला नहीं जा सका, on.exit(close(...)) का कोई प्रभाव नहीं पड़ेगा। showConnections() कनेक्शन नहीं दिखाता है, लेकिन किसी भी तरह आर अभी भी सोचता है कि यह वहां है। इसलिए, सभी नरक टूट जाते हैं और आप अपने आर को दुर्घटनाग्रस्त करते हैं।सुधार के लिए

धन्यवाद

एक साधारण कोड उदाहरण @Tommy को यह वर्णन करने के लिए:

myfun <- function(x){ 
    if(x>1) warning("aWarning") 
    stop("aStop") 
    x 
} 

tryCatch(myfun(0.5), 
      warning=function(w)print("warning"), 
      error=function(e) print("stop")) 
[1] "stop"    

tryCatch(myfun(1.5), 
      warning=function(w)print("warning"), 
      error=function(e) print("stop")) 
[1] "warning" 

सारांश में:

  • जांच प्रतीकों आप का उपयोग करें। वे शायद गलत हैं।
  • यदि आप त्रुटियों की अपेक्षा करते हैं तो कभी भी एक चेतावनी हैंडलर का उपयोग न करें।

और एक अतिरिक्त के रूप: अपने पाश केवल पिछले कॉल का परिणाम वापस आ जाएगी, जैसा कि आप prices आप पाश के माध्यम से जाना हर बार ऊपर लिख, मामले में आप सही प्रतीकों का प्रयोग किया गया होता।

संपादित करें: मामले में आप कार्रवाई

+0

जोरीस - यह बस उत्कृष्ट काम है! अगर मैं कर सकता तो मैं +10 दे दूंगा। –

+0

मैं सहमत हूं! ... लेकिन यह हालत प्रणाली में एक बड़ी गड़बड़ी इंगित करता है! on.exit कोड को हमेशा कॉल करने की गारंटी दी जानी चाहिए, अन्यथा हम सभी गहरे डोडो में हैं ... – Tommy

+0

हम्म मैंने बहुत जल्द बात की। ऐसा लगता है। एक्सीट सामान्य रूप से चल रहा है जब कोई चेतावनी होती है और पकड़ा जाता है? और बीटीडब्ल्यू, अगर कनेक्शन खोला नहीं जा सका, तो इसे बंद करने की आवश्यकता नहीं है ... – Tommy

9

कुछ कनेक्शन बंद? उस लूप बॉडी के अंत में closeAllConnections() डालने जितना आसान हो सकता है।

+0

से नीचे लिखा है क्या आपका मतलब है कि लूप के पहले बंद करेंऑल्कोनेक्शन()? – Dail

+1

@ Dwin मैं: *** पकड़ा segfault *** पता (शून्य), कारण 'स्मृति मैप नहीं' Traceback: 1: getConnection (सेट [i]) 2: करीब (getConnection (सेट [i ])) 3: closeAllConnections() निरस्त ... – Dail

8

यह वास्तव में आर स्रोत के बारे में कैसे कनेक्शन पंजीकृत हैं कोड में एक बग है जारी रखना चाहते हैं। मैंने यहां कुछ बगजिला साइट पर कुछ टिप्पणियां और पैच पोस्ट किया है: http://bugs.r-project.org/bugzilla3/show_bug.cgi?id=14660। जॉरीस की सिफारिशें ध्वनि हैं। हालांकि, जब बग ठीक हो जाता है, तो closeAllConnections() भी काम करेगा। (पीएस यह मेरा पहला स्टैक ओवरफ्लो पोस्ट है। अगर मैंने शिष्टाचार का उल्लंघन किया है तो मुझे क्षमा करें।)

+0

आपका स्वागत है! –

0

कहीं मेरे पिछले खुदाई में, किसी ने उल्लेख किया कि किसी फ़ंक्शन में URL.tert.url() या किसी फ़ंक्शन में URL संदर्भ का उपयोग यूआरएल() ने कुछ हद तक बग्गी देशी आर HTTP कनेक्टर का आह्वान किया। त्रुटि पर कनेक्शन बंद करने के लिए बेहतर काम करने के लिए क्या साबित हुआ है, यह स्पष्ट रूप से एक read.table(), या समकक्ष, फ़ंक्शन कॉल के अंदर RCurl को कॉल करना है। ,

result <- try (DF <- read.table(con <- url(url), col.names=colNames), 
silent=TRUE) 

मैं RCurl बदलाव के साथ जा रहा अच्छे परिणाम देखा है बुला अपनी getURL समारोह: उदाहरण के लिए, यह मेरे समस्याओं दे रहा था जब HTTP त्रुटियों की एक बहुत संचित

result <- try (DF <- read.table(textConnection(getURL(url)), col.names=colNames), 
silent=TRUE) 

यह जबकि चल रहा है आर v2.15.3।

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