मैं LOH विखंडन के बिना बड़े तारों में कितने RegExes (मिलान खोजने के लिए) चला सकता हूं?रेगेक्स, स्ट्रिंगबिल्डर और बड़े ऑब्जेक्ट हीप फ्रैगमेंटेशन
यह तो मैं उपयोग कर रहा हूँ StringBuilder
तो यह तथापि के रूप में जल्द मैं मैं जिसका मतलब है कि यह LOH में हो जाएगा StringBuilder.ToString()
कॉल करनी होगी उस पर एक रेगुलर एक्सप्रेशन से चलाने की आवश्यकता के रूप में LOH में नहीं है .NET फ्रेमवर्क 4.0 है।
क्या इस समस्या का कोई समाधान है? लंबे समय तक चलने वाले एप्लिकेशन के लिए यह लगभग असंभव है जो इस तरह के बड़े तारों और RegExes से संबंधित है।
एक आइडिया इस समस्या को हल करने के लिए: एक ओर जहां इस समस्या के बारे में सोच
, मुझे लगता है कि मैं एक गंदा समाधान मिल गया।
किसी दिए गए समय में मेरे पास केवल 5 तार हैं और इन 5 तारों (85 केबी से बड़े) RegEx.Match
पर पारित किए जाएंगे।
के बाद से विखंडन होती है क्योंकि नई वस्तुओं LOH में खाली स्थान को फिट नहीं होगा, इस समस्या का समाधान करना चाहिए:
PadRight
एक अधिकतम करने के लिए सभी स्ट्रिंग्स। स्वीकार किए जाते हैं आकार, के 1024KB कहना- तो सभी नए तार कर पहले ही खाली कर दिया करने के लिए स्मृति फिट होगा के रूप में पिछले स्ट्रिंग क्षेत्र से बाहर पहले से ही है के द्वारा (मैं
StringBuider
के साथ ऐसा करने की आवश्यकता हो सकती) - क्योंकि किसी भी विखंडन वहाँ नहीं होगा चलो ऑब्जेक्ट आकार हमेशा समान होता है इसलिए मैं केवल दिए गए समय पर 1024 * 5 आवंटित करूंगा, और इन स्ट्रिंग्स के बीच LOH में ये स्थान साझा किया जाएगा।
मैं इस डिजाइन करता है, तो अन्य बड़े वस्तुओं जो आवेदन शायद एक भी बदतर विखंडन के साथ 1024 KB तार के बहुत सारे आवंटित करने के लिए कारण होगा LOH में इस स्थान का आवंटन क्या होता है के साथ सबसे बड़ी समस्या यह लगता है। fixed
कथन मदद कर सकता है हालांकि मैं वास्तव में एक नई स्ट्रिंग बनाने के बिना RegEx को एक निश्चित स्ट्रिंग कैसे भेज सकता हूं जो एक निश्चित स्मृति पते में स्थित नहीं है?
इस सिद्धांत के बारे में कोई विचार? (दुर्भाग्य से मैं आसानी से समस्या का पुनरुत्पादन नहीं कर सकता, मैं आमतौर पर परिवर्तनों का निरीक्षण करने के लिए एक मेमोरी प्रोफाइलर का उपयोग करने की कोशिश कर रहा हूं और यह सुनिश्चित नहीं करता कि मैं किस प्रकार का पृथक परीक्षण केस इस के लिए लिख सकता हूं)
क्या आप निश्चित हैं कि बड़ी वस्तु ढेर खंडित हो रही है? मैं बड़े (कई सौ किलोबाइट्स) तारों के साथ बहुत सारे काम करता हूं, और मैंने कभी भी LOH विखंडन समस्या में भाग नहीं लिया है। –
हाँ मुझे यकीन है। आवेदन को वास्तविक प्रभाव देखने के लिए भूख लगी और लंबे समय तक चलने की जरूरत है। यदि आप वास्तव में स्मृति प्रोफाइलिंग करते हैं तो आप देख सकते हैं कि यह आपको प्रभावित कर रहा है लेकिन आपके ऐप को क्रैश करने के लिए पर्याप्त नहीं है। –
हाँ, यह आसान है। एक वसा सौ रुपये आपको 64-बिट ऑपरेटिंग सिस्टम खरीदता है। कोई भी प्रोग्रामिंग प्रयास उस से मेल नहीं खा सकता है। –