मैंने एक ऐसी स्थिति में भाग लिया है, जहां एक मिनीडम्प के अनुसार, कुछ फाइलें रिकर्सिव-डेसेंट पार्सर में स्टैक ओवरफ़्लो उत्पन्न कर रही हैं। दुर्भाग्यवश, मैं इस फाइल को एक उदाहरण के उदाहरण पर नहीं प्राप्त कर सकता हूं जो इस मुद्दे को पुन: उत्पन्न करने के लिए करता है (ग्राहक की गोपनीयता की चिंता है), जो मुझे इस पल के लिए असली समस्या का निदान करने के लिए थोड़ा सा झटका लगा देता है।मैं वर्कर थ्रेड पर स्टैक ओवरफ़्लो से कैसे रोक सकता हूं या पुनर्प्राप्त कर सकता हूं?
स्पष्ट रूप से पार्सर को कुछ ध्यान देने की ज़रूरत है, लेकिन अभी मेरी शीर्ष प्राथमिकता केवल प्रोग्राम को चलाने के लिए है। स्टॉपगैप उपाय के रूप में, मैं इसे पूरे कार्यक्रम को कम करने से रोकने के लिए क्या कर सकता हूं?
मेरी पहली पसंद यह अनुमान लगाने के लिए कुछ तरीका ढूंढना होगा कि मैं ढेर पर कमरे से बाहर भाग रहा हूं ताकि मैं ओवरफ्लो होने से पहले पार्सर को गर्वपूर्वक बंद कर सकूं। फ़ाइल को पार्स करने में विफल होना एक स्वीकार्य विकल्प है। दूसरी पसंद यह होने देना है, त्रुटि पकड़ें और इसे लॉग करें, फिर शेष डेटा के साथ जारी रखें।
पार्सिंग Parallel.ForEach()
लूप में हो रहा है। मैं इसे किसी अन्य दृष्टिकोण के लिए स्वैप करने के लिए तैयार हूं अगर इससे मदद मिलेगी।
संपादित करें: वास्तव में हत्यारा क्या होगा यदि मैं वर्तमान धागे के ढेर का आकार प्राप्त कर सकूं, और स्टैक पॉइंटर की स्थिति प्राप्त कर सकूं। क्या यह संभव है?
संपादित करें 2: अंततः मैं किसी से नमूना फ़ाइल लिखने और डीबगर में त्रुटि को फंसाने में कामयाब रहा। यह पता चला है कि यह कोड नहीं है जो हमारे लिए है - अपवाद कहीं भी HtmlAgilityPack में हो रहा है। तो ऐसा लगता है कि मुझे पूरी तरह से अलग करने की कोशिश करने और खोजने की ज़रूरत है।
यह सुनिश्चित नहीं है कि इससे मदद मिलेगी कि स्टैक ओवरफ़्लो का क्या कारण है, स्पष्ट नहीं है (पैरालाइज़्म का कारण यह नहीं होना चाहिए: पुनर्संरचना हो सकती है), लेकिन क्या आपने समवर्ती कॉल की मात्रा को सीमित करने के लिए 'समांतर विकल्प। मैक्सडिग्री ओफपेरेलिज्म' का उपयोग करने का प्रयास किया है? – Jcl
एक विकल्प सिर्फ पार्स की वर्तमान "गहराई" को ट्रैक करना है, और अगर यह बहुत अधिक हो तो जमानत है। – dlev
@dlev मुझे अधिक जानकारी चाहिए, हालांकि। .NET प्रलेखन से पता चलता है कि, लेकिन मैं एक उचित अधिकतम गहराई कैसे चुनूं, यह देखते हुए कि स्टैक फ्रेम और कॉल स्टैक दोनों में अलग-अलग आकार हो सकते हैं? –