मैं एक .NET 3.5 आवेदनबड़े तारों को संसाधित करना, क्या यह बड़ा ऑब्जेक्ट हीप फ्रैगमेंटेशन है?
- एक समारोह जब मैं प्रोफ़ाइल एक लाख गुना
- यह खोज & कर रहा है 1 एमबी + तार में & regex संचालन की जगह (विभिन्न आकार के तार)
चल रहा है है आवेदन मैं इन तारों की पुष्टि कर सकता हूं LOH में संग्रहीत किया जाता है लेकिन बाद में उन्हें जीसी द्वारा पुनः दावा किया जाता है, इसलिए किसी दिए गए समय में उनमें से केवल अधिकतम 10 LOH (10 थ्रेड चल रहा है) में हैं।
मेरे समझ, इन बड़ी तार LOH में स्थित हैं है, तो उनके आवंटन स्थानों की वजह से जी सी द्वारा पुन: दावा, लेकिन अभी तक किसी भी तरह (और LOH में किया जा रहा है ताकि नहीं मिल जमा) इस विखंडन का कारण बनता है हो रही है। ऑपरेशन में कोई स्मृति रिसाव होने के बावजूद यह हो रहा है।
यह 100k बार में कोई समस्या नहीं पैदा करता है, हालांकि जब यह 1 एम + तक पहुंच जाता है तो यह स्मृति अपवादों से बाहर निकलता है।
मैं चींटियों मेमोरी प्रोफाइलर उपयोग कर रहा हूँ और यह परिणाम है कि मैं जल्दी फांसी में मिल गया है:
.NET Using 70MB of 210MB total private bytes allocated in to the application
Number of Fragments: 59
Number of Large Fragments : 48 (99.6% of free memory)
Largest Fragment: 9MB
Free Space: 52% of total memory (37MB)
Unmanaged Memory: 66% of total private memory (160MB)
- क्या आपको लगता है मेरी निदान हाथ में डेटा के आधार पर सही हैं?
- यदि हां, तो मैं इस LOH Fragmentation समस्या को कैसे हल कर सकता हूं? मुझे उन तारों को संसाधित करना है और वे बड़े तार हैं। क्या मुझे उन्हें विभाजित करने और उस तरह की प्रक्रिया करने का कोई तरीका मिलना चाहिए? उस मामले में विभाजित तारों में रेगेक्स इत्यादि चलाना वास्तव में चुनौतीपूर्ण होगा।
एक अन्य संभव समाधान: एक अलग प्रक्रिया है कि स्ट्रिंग संसाधन करता है, और प्रत्येक स्ट्रिंग (या हर 100K है कि यदि आप स्ट्रिंग्स के लिए ठीक लग रहा है, आदि) के लिए एक नई प्रक्रिया का उपयोग करें। प्रत्येक प्रक्रिया एक साफ स्लेट के साथ शुरू होता है। यह आईआईएस ऐप पूल - विखंडन को रीसायकल करने के कारणों में से एक है। – vcsjones
@vcsjones, मैंने सोचा कि इससे पहले कि मैं वास्तव में और इसे ओवरकिल करता हूं :) मैं यह सुनिश्चित करना चाहता हूं कि यह कारण है। मैं जीसी के बढ़िया विवरण के लिए नया हूं इसलिए मुझे घंटों और बाद में यह नहीं पता कि मैंने वास्तव में कुछ भी हल नहीं किया है! समस्या वास्तविक समस्या को पुन: उत्पन्न करना काफी कठिन है, अगर मैं भाग्यशाली हूं तो इसमें एक या दो दिन लग सकते हैं। तो मैं ज्यादातर समय के लिए प्रोफाइलर का शब्द लेता हूं। –
आप 64 बिट मोड में प्रोग्राम चलाने का प्रयास कर सकते हैं। इससे समस्या हल हो जाएगी क्योंकि वर्चुअल स्पेस बहुत बड़ा है। – xanatos