2012-01-26 15 views
8

मुझे इस समस्या का सामना कुछ बार हुआ है, और मैं किसी भी समाधान को समझने में सक्षम नहीं हूं लेकिन मामूली एक (नीचे देखें)।आर पैकेज को अद्यतन करने के लिए सुरक्षित तरीका - "हॉट-स्वैपिंग" संभव है?

मान लीजिए कि कोई कंप्यूटर 2+ उपयोगकर्ता या 1 उपयोगकर्ता एकाधिक प्रक्रियाओं को चलाने के कारण आर के 2+ उदाहरण चला रहा है, और एक उदाहरण update.packages() निष्पादित करता है। मेरे पास कई बार है जहां दूसरा उदाहरण बड़ा समय निकाल सकता है। अद्यतन किए जा रहे संकुल कार्यक्षमता को किसी भी तरह से परिवर्तित नहीं करते हैं जो गणना को प्रभावित करता है, लेकिन किसी भी तरह से एक बड़ी समस्या उत्पन्न होती है।

मामूली समाधान (समाधान 0) आर के सभी उदाहरणों को समाप्त करना है जबकि update.packages() निष्पादित करता है। इसमें 2+ समस्याएं हैं। सबसे पहले, किसी को आर उदाहरणों को समाप्त करना होगा। दूसरा, कोई भी यह पहचानने में सक्षम नहीं हो सकता है कि वे उदाहरण कहां चल रहे हैं (अपडेट 1 देखें)।

मानते हैं कि निष्पादित किए जा रहे कोड का व्यवहार नहीं बदलेगा (उदाहरण के लिए पैकेज अपडेट सभी फायदेमंद हैं - वे केवल बग ठीक करते हैं, गति में सुधार करते हैं, रैम को कम करते हैं, और यूनिकॉर्न देते हैं), क्या हॉट-स्वैप करने का कोई तरीका है पैकेज की नई संस्करण अन्य प्रक्रियाओं पर कम प्रभाव के साथ?

मैं आर के बाहर दो और उम्मीदवार समाधान है,:

समाधान 1 एक अस्थायी पुस्तकालय पथ का उपयोग और उसके बाद वर्ष पुराने पुस्तकालय हटा सकते हैं और अपनी जगह में नया ले जाने के लिए है। इसका दोष यह है कि हटाए गए + कदम कुछ समय लग सकते हैं जिसके दौरान कुछ भी उपलब्ध नहीं है।

समाधान 2 लाइब्रेरी (या लाइब्रेरी पदानुक्रम) को इंगित करने के लिए सिम्लिंक का उपयोग करना है और एक नई लाइब्रेरी में एक पॉइंटर के साथ सिमलिंक को ओवरराइट करना है जहां अद्यतन पैकेज रहता है। ऐसा लगता है कि ओएस के लिए सिमलिंक को ओवरराइट करने में लगने वाला समय भी कम पैकेज डाउनटाइम होता है। इसका नकारात्मक पक्ष यह है कि इसे सिम्लिंक के प्रबंधन में बहुत अधिक देखभाल की आवश्यकता होती है, और यह प्लेटफार्म-विशिष्ट है।

मुझे लगता है कि समाधान # 1, # 2 की तरह बनना .libPaths() के चतुर उपयोग द्वारा संशोधित किया जा सकता है, लेकिन यह लगता है एक के लिए नहीं कॉल update.packages() की जरूरत है और इसके बजाय कि पुरानी पड़ चुकी संकुल पाता है एक नया अपडेटर लिखने की तरह, यदि इंस्टॉल उन्हें एक अस्थायी पुस्तकालय में, और फिर लाइब्रेरी पथ अद्यतन करता है। इसका उछाल यह है कि कोई भी .libPaths() पर मौजूदा प्रक्रिया को बाधित कर सकता था जब यह शुरू हुआ था (यानी लाइब्रेरी पथ आर को बदलना, उन उदाहरणों के लिए प्रचारित नहीं किया जा सकता है जो पहले से चल रहे हैं, उस उदाहरण के भीतर कुछ स्पष्ट हस्तक्षेप किए बिना)।


अद्यतन 1. उदाहरण परिदृश्य में, दो प्रतिस्पर्धी आर उदाहरण एक ही मशीन पर हैं। यह एक आवश्यकता नहीं है: जहां तक ​​मैं अद्यतनों को समझता हूं, यदि दोनों एक ही पुस्तकालयों को साझा करते हैं, यानी साझा ड्राइव पर एक ही निर्देशिका, तो अद्यतन अभी भी समस्याएं पैदा कर सकता है, भले ही आर का अन्य उदाहरण किसी अन्य मशीन पर हो । तो, कोई गलती से आर प्रक्रिया को मार सकता है और इसे भी नहीं देख सकता है।

उत्तर

3

मेरा मजबूत अनुमान यह है कि इसके आसपास कोई रास्ता नहीं है।

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

(मेरे संदेह से कुछ पुष्टि the R for Windows FAQ से है, जो रिपोर्ट है कि 'विंडोज ताले [एक] पैकेज के DLL जबकि यह भरी हुई है' update.packages() विफल हो सकता है, जो आता है।)

मैं वास्तव में कैसे यकीन नहीं है आर आलसी लोड तंत्र लागू किया गया है, लेकिन कल्पना कीजिए कि यह भी उन वस्तुओं को हटाने से गड़बड़ हो सकता है जिन्हें यह मशीन में किसी विशेष पते पर ढूंढने की अपेक्षा करता है।

कोई और जो कंप्यूटर के आंतरिक के बारे में और जानता है निश्चित रूप से इससे बेहतर जवाब देगा, लेकिन ये मेरे विचार हैं।

+0

यह एक है महत्वपूर्ण बिंदु। मुझे संदेह है कि साझा लाइब्रेरी का मुद्दा ऑपरेटिंग सिस्टम में एक समस्या है। अधिकांश उपयोग के लिए, मुझे विश्वास है कि यह हॉटस्पैपिंग के विचार को मारता है। सबसे संगत केस उन पैकेजों के लिए होगा जो बाह्य साझा पुस्तकालयों का उपयोग नहीं करते हैं, लेकिन मुझे यकीन नहीं है कि यह उन पैकेजों के लिए कैसे काम करता है जो पूरी तरह से आर – Iterator

+0

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

4

एक उत्पादन वातावरण में, शायद आप कम से कम दो संस्करण, वर्तमान और पिछले एक को रखना चाहते हैं ताकि किसी समस्या के मामले में जल्दी से पुराने पर वापस जाने में सक्षम हो सकें। कुछ भी ओवरराइट या हटाया नहीं जाएगा। पूरे आर पारिस्थितिकी तंत्र के लिए ऐसा करना आसान है: आपके पास कई निर्देशिकाएं होंगी, "आर-2.14.1-2011-12-22", "आर-2.14.1-2012-01-27", आदि, प्रत्येक में सब कुछ शामिल है (आर निष्पादन योग्य और सभी संकुल)। उन निर्देशिकाओं को कभी अपडेट नहीं किया जाएगा: यदि कोई अपडेट की आवश्यकता है, तो एक नई निर्देशिका बनाई जाएगी। (कुछ फाइल सिस्टम "स्नैपशॉट्स" प्रदान करते हैं जो आपको बिना किसी डिस्क स्थान के उपयोग के कई बहुत ही समान निर्देशिकाएं प्रदान करने की अनुमति देते हैं।)

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

+0

यह एक अच्छा सुझाव है, दोनों परिवर्तनों को वापस/वापस करने और परिणामों को पुन: पेश करने की क्षमता के लिए। मुझे इसे संस्करण जानकारी संचार के ओवरहेड के बारे में कुछ और विचार देने की ज़रूरत है। – Iterator

+0

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

1

यहाँ एक परिदृश्य मैं Windows 7 पर

  1. मैं एक अनुसंधान सत्र चला रहा हूँ कल का सामना करना पड़ा है।
  2. पैकेज मैनुअल का पीडीएफ खोलें।
  3. सभी आर सत्र बंद करें। पैकेज मैनुअल पीडीएफ को बंद करने के लिए भूल जाओ।
  4. ओपन आर का एक नया उदाहरण, चलाने update.packages()

स्थापित निश्चित रूप से विफल रहता है क्योंकि Windows अभी भी पीडीएफ खुला है और यह अधिलेखित नहीं कर सकते हैं ....

+0

+1 यह साझा वातावरण में बहुत खराब होगा। मैंने कई उपयोगकर्ताओं के साथ लिनक्स के तहत परीक्षण नहीं किया है, लेकिन मुझे आश्चर्य है कि यह एक स्थिति के लिए कैसे काम करेगा, कहें, 100 उपयोगकर्ता और कोई पैकेज पैकेजिंग पढ़ रहा है ... – Iterator

+0

लिनक्स पर, इससे कोई समस्या नहीं पड़ेगी: डिफ़ॉल्ट रूप से, उपयोग में फ़ाइलों को लॉक नहीं किया जाता है। यदि पीडीएफ फ़ाइल अभी भी अद्यतन के बाद है, पीडीएफ दर्शक परिवर्तन को नोटिस करेगा, ताज़ा करें, और नया प्रदर्शित करें। यदि पीडीएफ फाइल अब नहीं है, तो पीडीएफ व्यूअर शायद पुराना एक प्रदर्शित करेगा (फ़ाइल वास्तव में हटाई नहीं गई है, यह एक लिम्बो राज्य में है, अभी भी वहां कोई नाम नहीं है, और केवल वास्तव में गायब हो जब सभी एप्लिकेशन इसे फ़ाइल बंद करते हैं)। सबसे बुरे मामले में, पीडीएफ दर्शक एक त्रुटि संदेश प्रदर्शित करेगा - लेकिन यह अद्यतन को रोक नहीं पाएगा। –

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