से आने वाले बड़े ऑब्जेक्ट हीप और स्ट्रिंग ऑब्जेक्ट्स में मेरे पास एक विंडोज कंसोल ऐप है जिसे बिना दिन और महीनों के पुनरारंभ किए बिना चलाने के लिए माना जाता है। ऐप एक एमएसएमक्यू से "काम" पुनर्प्राप्त करता है और इसे संसाधित करता है। ऐसे 30 धागे हैं जो एक साथ काम की प्रक्रिया को संसाधित करते हैं।एक कतार
एमएसएमक्यू से आने वाले प्रत्येक कार्य खंड लगभग 200kb है जिसमें से अधिकांश एकल स्ट्रिंग ऑब्जेक्ट में आवंटित किया जाता है।
मैंने देखा है कि इन कामों के लगभग 3-4 हजार प्रोसेसिंग के बाद आवेदन की स्मृति खपत हास्यास्पद रूप से 1 - 1.5 जीबी स्मृति का उपभोग कर रही है।
मैं एक प्रोफाइलर के माध्यम से ऐप चलाता हूं और ध्यान देता हूं कि इस स्मृति में से अधिकांश (शायद एक गीगा या तो) बड़े ऑब्जेक्ट ढेर में उपयोग नहीं किया जाता है लेकिन संरचना खंडित होती है।
मुझे पता चला है कि इनमें से 9 0% अप्रयुक्त (कचरा एकत्रित) बाइट्स पहले स्ट्रिंग आवंटित किए गए थे। मैंने संदेह करना शुरू कर दिया कि एमएसएमक्यू से आने वाले तारों को आवंटित किया गया था, इस्तेमाल किया गया था और फिर विघटित किया गया था और इसलिए विखंडन का कारण है।
मैं समझता हूं कि जीसी.कोलेक्ट (2 या जीसी.मैक्स ...) जैसी चीजें मदद नहीं करती हैं क्योंकि वे बड़े ऑब्जेक्ट ढेर को जीसी करते हैं लेकिन इसे कॉम्पैक्ट नहीं करते हैं (जो यहां समस्या है)। तो मुझे लगता है कि मुझे इन स्ट्रिंग्स को कैश करना और उन्हें किसी भी तरह से फिर से उपयोग करना है, लेकिन स्ट्रिंग्स अपरिवर्तनीय हैं, इसलिए मुझे स्ट्रिंगबिल्डर का उपयोग करना होगा।
मेरा प्रश्न है: क्या अंतर्निहित संरचना को बदलने के लिए वैसे भी है (यानी एमएसएमक्यू का उपयोग करना क्योंकि यह कुछ ऐसा नहीं है जिसे मैं बदल नहीं सकता) और फिर भी LOH को खंडित करने से बचने के लिए हर बार एक नई स्ट्रिंग शुरू करने से बचें?
धन्यवाद, Yannis
अद्यतन: के बारे में कैसे इन "काम" मात्रा वर्तमान में वर्तमान में
प्राप्त किए गए हैं इन MSMQ में WorkChunk वस्तुओं के रूप में जमा हो जाती है। इन वस्तुओं में से प्रत्येक में स्ट्रिंग नामक एक स्ट्रिंग और हेडर नामक एक और स्ट्रिंग होता है। ये वास्तविक पाठ डेटा हैं। यदि आवश्यक हो तो मैं स्टोरेज स्ट्रक्चर को किसी और चीज में बदल सकता हूं और संभावित रूप से अंतर्निहित स्टोरेज तंत्र को एमएसएमक्यू की तुलना में किसी और चीज की आवश्यकता हो सकती है।
कार्यकर्ता नोड्स तरफ वर्तमान में हम करते हैं
WorkChunk हिस्सा = _Queue.Receive();
तो इस चरण में हम बहुत कम कैश कर सकते हैं। अगर हमने संरचना को किसी भी तरह बदल दिया तो मुझे लगता है कि हम कुछ प्रगति कर सकते हैं। किसी भी मामले में, हमें इस समस्या को हल करना होगा ताकि काम के महीनों को फेंकने से बचने के लिए हम जो कुछ भी कर सकें, हम करेंगे।
अद्यतन: मैंने नीचे दिए गए कुछ सुझावों को आजमाया और देखा कि यह समस्या मेरी स्थानीय मशीन (विंडोज 7 x64 और 64 बिट ऐप चलाने) पर पुन: उत्पन्न नहीं की जा सकती है। यह चीजों को और अधिक कठिन बनाता है - अगर कोई जानता है कि क्यों यह वास्तव में स्थानीय रूप से इस मुद्दे को पुनर्निर्मित करने में मदद करेगा।
आप उन तारों को कैसे प्राप्त करते हैं? एक बार वे तार हैं तो आप अटक गए हैं। मैं वे एक धारा या बाइट से आते हैं [] आपके पास कुछ विकल्प हो सकते हैं। –
हाय हेनक - इन कामों के बारे में अधिक जानकारी प्राप्त करने के लिए अद्यतन पर एक नज़र डालें – Yannis
लेकिन क्या यह एक वास्तविक समस्या है? एक 64 बिट पीसी पर 1.5 जीबी> = 8 जीबी रैम जारी रखने में सक्षम होना चाहिए। –