2013-08-05 7 views
6

मुझे एक ऐसे कार्यक्रम को लिखने की ज़रूरत है जो संभावित राज्यों की एक बड़ी जगह में समांतर खोज करे, जिसमें प्रक्रियाओं में नए क्षेत्रों की खोज की जा रही है (और उनकी खोज शुरू हुई), और अन्वेषण कुछ क्षेत्रों को प्रारंभिक रूप से समाप्त किया जा रहा है क्योंकि अन्यत्र प्राप्त किए गए मध्यवर्ती परिणामों में नए उपयोगी परिणामों की खोज की संभावना समाप्त हो जाती है। खोज मध्यवर्ती डेटा के पुनर्मूल्यांकन से बचने के लिए एक दूसरे के साथ भारी सहयोग में चल रहे कई धागे का उपयोग करके किया जाता है।बिजली/हार्डवेयर/ओएस विफलताओं के लिए प्रतिरोधी एक कार्यक्रम

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

बड़े खोज डोमेन की वजह से, कार्यक्रम संभवतः अंतिम परिणाम देने से पहले महीनों तक चलता रहेगा। इसलिए, कार्यक्रम निष्पादन के दौरान बिजली, हार्डवेयर या ओएस विफलता का एक बड़ा खतरा है जो इस पल के लिए किए गए सभी कार्यों का पूरा नुकसान हो सकता है। ऐसे मामले में कार्यक्रम को अपनी सभी गणनाओं को स्क्रैच से पुनरारंभ करने की आवश्यकता होगी।

मुझे ऐसे समाधान की आवश्यकता है जो ऐसे मामलों में पूर्ण डेटा हानि को रोक सके। मैंने एक निष्पादन इंजन/मंच के बारे में सोचा जो लगातार प्रक्रिया की वर्तमान स्थिति को एक अनावश्यक-प्रतिरोधी भंडारण जैसे अनावश्यक डिस्क सरणी या डेटाबेस में सहेजता है। लेकिन मैं समझता हूं कि यह दृष्टिकोण प्रक्रिया को काफी धीमा कर सकता है, यहां तक ​​कि एक डिग्री तक जब अपेक्षित गणना समय की तुलना में कोई लाभ नहीं होगा, संभावित विफलताओं के कारण पुनरारंभ करना शामिल है।

वास्तव में, मुझे एक आदर्श समाधान की आवश्यकता नहीं है कि लगातार प्रोग्राम स्थिति बचाता है, और मैं आसानी से घंटों का नुकसान या शायद दिन के काम भी सहन कर सकता हूं। मेरे दिमाग में आने वाला एक संभावित हेवीवेट समाधान प्रोग्राम को वर्चुअल मशीन के अंदर चलाने, समय-समय पर अपने स्नैपशॉट्स को सहेजना और हालिया स्नैपशॉट से संभावित मेजबान विफलता के बाद मशीन को बहाल करना है। यह दृष्टिकोण यादृच्छिक या रोकथाम करने योग्य अतिथि ओएस विफलता के बाद प्रोग्राम स्थिति को पुनर्प्राप्त करने में भी मदद कर सकता है।

क्या एक समान प्रक्रिया है, लेकिन एक हल्की समाधान एक प्रक्रिया की स्थिति को संरक्षित करने के लिए सीमित है? या आप किसी अन्य दृष्टिकोण का सुझाव दे सकते हैं जो मेरी समस्या का समाधान कर सके?

+0

वीएम समाधान वास्तव में हेवीवेट आईएमओ नहीं है (हालांकि मैं डेवलपर के परिप्रेक्ष्य से सोच रहा हूं, और जटिल राज्य-बचत और एक बहु थ्रेडेड प्रक्रिया में पुनः लोड करने से मुझे क्रिंग कर रहा है), और यदि आप एक सरल " विराम "अन्वेषण प्रक्रिया के लिए तंत्र जबकि वीएम एक स्नैपशॉट सहेज रहा है, बस अतिरिक्त सुरक्षित होने के लिए - यह मेरी पसंदीदा पसंद होगी। –

+0

वहां "चेकपॉइंट्स" को सहेजने के लिए कई प्रकार के सॉफ़्टवेयर हैं ... लेकिन आप इसका उल्लेख नहीं करते कि ओएस या प्रोग्रामिंग भाषा का उपयोग करने का आपका इरादा क्या है। – idfah

उत्तर

1

आप एर्लांग का उपयोग करना चाहते हैं जो बड़ी संख्या में धागे अपेक्षाकृत कम लागत पर चलने की अनुमति देता है। चूंकि धागा लागत कम है, इसलिए बढ़ी विश्वसनीयता को प्राप्त करने के लिए अनावश्यकता का उपयोग किया जा सकता है।

आपके द्वारा पेश की जाने वाली समस्या के लिए, एक तिहाई-रिडंडेंसी योजना जाने का तरीका हो सकता है, जहां तीन (या अधिक) सिस्टम में सिंक्रनाइज़ेशन के लिए आवधिक जांच विफल हो जाती है जो वोट विफल हो जाती है।

+0

और 'मिनेसिया' टेबल का उपयोग करके आप अपने राज्य को अनावश्यक रूप से> 1 मशीनों में स्टोर कर सकते हैं। – haavee

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