2012-01-29 5 views
6

हमारे पास .NET 4.0 में बनाई गई एक विंडोज सेवा है, सेवाएं बड़ी टेक्स्ट फाइलों को पार करती हैं जो अल्पविराम से अलग मूल्यों (कई मिलियन लाइनों, 5- 10 मान), यहां कोई समस्या नहीं है, हम लाइनों को पढ़ सकते हैं, उन्हें एक कुंजी/मूल्य संग्रह में विभाजित कर सकते हैं और मानों को संसाधित कर सकते हैं। मूल्यों को प्रमाणित करने के लिए हम मूल्यों को पारित करने के लिए डेटा पैराेलिज्म का उपयोग कर रहे हैं, जो मूल रूप से विशिष्ट प्रारूपों में मानों की एक सरणी है, जो कि अलग-अलग मानों पर RegEx सत्यापन करता है।रेगेक्स और विभिन्न फ्रेमवर्क संस्करणों के साथ मेमोरी उपयोग और ज्ञात समस्याएं

ऊपर तक अब हम स्थिर रेगुलर एक्सप्रेशन, नहीं स्थिर RegEx.IsMatch विधि लेकिन RegexOption RegexOptions.Compiled के रूप में परिभाषित के साथ एक स्थिर रेगुलर एक्सप्रेशन से संपत्ति का इस्तेमाल किया है, नीचे दिए गए विवरण के रूप में।

private static Regex clientIdentityRegEx = new Regex("^[0-9]{4,9}$", RegexOptions.Compiled); 

इस विधि हम एक सुंदर मानक स्मृति पदचिह्न था का उपयोग करना, स्मृति प्रत्येक पंक्ति में मूल्यों का अधिक से अधिक संख्या के साथ मामूली वृद्धि हुई है, समय लिया लाइनों की कुल संख्या के कम या ज्यादा रैखिक था।

विभिन्न प्रारूपों में नियमित अभिव्यक्तियों का उपयोग करने के लिए, विभिन्न फ्रेमवर्क संस्करणों के लिए, हमने हाल ही में स्थैतिक RegEx गुणों को एक सामान्य उपयोगिता प्रोजेक्ट में स्थानांतरित कर दिया है जिसे अब नेट 2.0 सीएलआर (वास्तविक नियमित अभिव्यक्तियों का उपयोग करके संकलित नहीं किया गया है) बदल दिया गया), 25 या उससे भी अधिक, रेगेक्स गुणों की संख्या लगभग 60 हो गई है। ऐसा करने के बाद से हमने स्मृति समस्याओं में भागना शुरू कर दिया है, मूल परियोजना की स्मृति 3 या उससे अधिक बार में वृद्धि हुई है। जब हम चल रहे सेवा को प्रोफ़ाइल करते हैं तो हम देख सकते हैं कि स्मृति RegEx.IsMatch से "लीकिंग" प्रतीत होती है, कोई विशिष्ट RegEx नहीं, लेकिन विभिन्न के आधार पर विभिन्न कहा जाता है।

मुझे .NET 1.0/1.1 RegEx से संबंधित बीसीएल टीम में से एक से पुराने MSDN blog post पर निम्न टिप्पणी मिली।

हालांकि संकलन के लिए और भी लागतें हैं जिनका उल्लेख किया जाना चाहिए। प्रतिबिंब के साथ आईएल उत्सर्जित करना। बहुत सारे कोड लोड करता है और बहुत सारी मेमोरी का उपयोग करता है, और यह स्मृति नहीं है कि आप कभी वापस आ जाएंगे। के अतिरिक्त। v1.0 और v1.1 में, हम कभी भी आईएल को जेनरेट नहीं कर पाएंगे, जिसका अर्थ है कि आपने इस मोड का उपयोग कर स्मृति लीक की है। हमने व्हिडबे में उस समस्या को ठीक कर दिया है। लेकिन नीचे की रेखा यह है कि आपको केवल इस मोड का उपयोग अभिव्यक्ति के सीमित सेट के लिए करना चाहिए जिसे आप जानते हैं बार-बार उपयोग किया जाएगा।

मैं जोड़ूंगा कि हमने सामान्य रेगेक्स कॉल का "सबसे अधिक" प्रोफाइल किया है और व्यक्तिगत रूप से इस मुद्दे को दोहराना नहीं कर सकता।

क्या यह .NET 2.0 CLR के साथ ज्ञात समस्या है?

लेख में लेखकों राज्यों "लेकिन लब्बोलुआब यह है कि आप केवल पता है जो आप बार-बार उपयोग किया जाएगा अभिव्यक्ति की एक परिमित सेट के लिए इस विधा का उपयोग करना चाहिए है" कर रहे हैं, क्या परिमित होने की संभावना है इस तरह से उपयोग की जाने वाली अभिव्यक्तियों की संख्या, और क्या यह एक कारण होने की संभावना है?

अद्यतन: @Henk Holterman से जवाब के साथ लाइन में किसी भी सर्वोत्तम प्रथाओं बेंचमार्क रेगुलर एक्सप्रेशन का परीक्षण, विशेष रूप से RegEx.IsMatch के लिए, मात्रा और पैरामीटर प्रारूप द्वारा सरासर जानवर बल का उपयोग कर के अलावा अन्य है?

उत्तर: "परिदृश्य रेगुलर एक्सप्रेशन से वस्तुओं की एक सीमित, निर्धारित संख्या के लिए कहता है" की हैंक्स जवाब काफी मौके पर ही था, हम कक्षा में स्थिर RegEx'es जोड़ा जब तक हम एक notible वृद्धि के साथ भाव अलग-थलग स्मृति उपयोग में, इन्हें स्थैतिक वर्गों को अलग करने के लिए माइग्रेट किया गया था, जो कुछ स्मृति मुद्दों को हल कर चुके हैं।

ऐसा प्रतीत होता है, हालांकि मैं इसे पुष्टि नहीं कर सकता, नेट 2.0 सीएलआर और नेट 4.0 सीएलआर के बीच संकलित RegEx उपयोग के बीच एक अंतर है क्योंकि स्मृति समस्याएं तब होती हैं जब पूरी तरह से .NET 4.0 ढांचे के लिए अनुपालन किया जाता है । (कोई पुष्टि?)

+1

ठीक है, आपने अपना कोड _and_ को RegEx के एनआर को काफी बढ़ाया है। क्या आप वापस जा सकते हैं और एक समय में एक कर सकते हैं? –

+0

प्रोफाइलर आपको वास्तव में क्या बताता है? स्मृति लीकिंग के बारे में? –

+0

हां हमने आज देर से ऐसा किया है और .NET 2.0 सीएलआर में संकलित प्रोजेक्ट के साथ पहले इस्तेमाल किए गए रेगेक्स के समान संख्या के साथ मेमोरी में वृद्धि हुई थी, ऐसा लगता है कि हम कितने जोड़ते हैं लेकिन कैसे वे सीधे संबंध नहीं रखते हैं बुलाया जाता है और अभिव्यक्ति का प्रकार। – Lloyd

उत्तर

1

परिदृश्य RegEx ऑब्जेक्ट्स की सीमित, निश्चित संख्या के लिए कॉल करता है। वह रिसाव नहीं होना चाहिए। आपको यह सत्यापित करना चाहिए कि नई स्थिति में RegEx ऑब्जेक्ट्स का अभी भी उपयोग किया जा रहा है।

अन्य संभावना बढ़ी हुई संख्या (25 से 60) अभिव्यक्तियों की है। क्या उनमें से एक शायद थोड़ा और जटिल हो सकता है, जिससे अत्यधिक बैकट्रैकिंग हो सकती है?

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