मेरा एप्लिकेशन बाइनरी क्रमबद्धरण और बड़ी वस्तुओं के संपीड़न का एक अच्छा सौदा करता है। धारावाहिक डेटासेट को असम्पीडित लगभग 14 एमबी है। संकुचित यह लगभग 1.5 एमबी है। मुझे लगता है कि जब भी मैं अपने डेटासेट पर धारावाहिक विधि को कॉल करता हूं तो मेरा बड़ा ऑब्जेक्ट हीप प्रदर्शन काउंटर 1 एमबी से लगभग 9 0 एमबी तक बढ़ जाता है। मुझे यह भी पता है कि अपेक्षाकृत भारी भारित प्रणाली के तहत, आम तौर पर चलने (कुछ दिनों) के दौरान, जब यह क्रमिकरण प्रक्रिया कुछ समय होती है, तो एप्लिकेशन को स्मृति उत्तेजनाओं से बाहर फेंकने के लिए जाना जाता है जब इस धारावाहिक विधि को तब भी कहा जाता है लगता है कि बहुत मेमोरी है। मुझे लगता है कि विखंडन मुद्दा है (हालांकि मैं नहीं कह सकता कि मैं 100% निश्चित हूं, मैं बहुत करीब हूं)क्या मुझे जीसी को कॉल करना चाहिए। विखंडन को रोकने के लिए बड़े ऑब्जेक्ट ढेर का उपयोग करने के तुरंत बाद चयन करें
सबसे सरल शॉर्ट टर्म फिक्स (मुझे लगता है कि मैं एक अल्पकालिक दोनों की तलाश में हूं और एक दीर्घकालिक उत्तर) मैं सोच सकता हूं कि जीसी को कॉल करना है। सीरियलाइजेशन प्रक्रिया पूरी करने के बाद ठीक से चयन करें। यह मेरी राय में, कचरे को एलओएच से वस्तु एकत्र करेगा और इससे पहले कि अन्य वस्तुओं को इसमें जोड़ा जा सके, ऐसा करने की संभावना है। यह अन्य वस्तुओं को ढेर में शेष वस्तुओं के खिलाफ कसकर कसकर फिट करने की अनुमति देगा बिना विखंडन के।
इस हास्यास्पद 90 एमबी आवंटन के अलावा मुझे नहीं लगता कि मेरे पास LOH के खोने का उपयोग करने वाला कुछ और है। यह 9 0 एमबी आवंटन भी अपेक्षाकृत दुर्लभ है (हर 4 घंटे के आसपास)। निश्चित रूप से हमारे पास अभी भी 1.5 एमबी सरणी होगी और शायद कुछ अन्य छोटे धारावाहिक वस्तुएं होंगी।
कोई विचार? अच्छा प्रतिक्रियाओं
के परिणामस्वरूप
अद्यतन यहाँ मेरी कोड है जो काम करता है। मैंने वास्तव में WHILE धारावाहिक को संपीड़ित करने के लिए इसे बदलने की कोशिश की है ताकि धारावाहिक एक ही समय में एक धारा में क्रमबद्ध हो और मुझे बेहतर परिणाम न मिले। मैंने मेमोरी स्ट्रीम को 100 एमबी तक प्रीलोकेट करने का प्रयास किया है और एक ही स्ट्रीम को लगातार दो बार उपयोग करने की कोशिश की है, LOH वैसे भी 180 एमबी तक चला जाता है। मैं इसे मॉनीटर करने के लिए प्रोसेस एक्सप्लोरर का उपयोग कर रहा हूं। यह पागल है। मुझे लगता है कि मैं अगले अप्रबंधित मेमरीस्ट्रीम विचार का प्रयास करने जा रहा हूं।
मैं आपको लोगों को प्रोत्साहित करने के लिए प्रोत्साहित करता हूं यदि आप नहीं चाहते हैं। यह सटीक कोड नहीं होना चाहिए। बस एक बड़े डाटासेट को क्रमानुसार और आप आश्चर्य की बात परिणाम मिलेंगे अगर मैं UnmanagedMemoryStream के साथ द्विआधारी क्रमांकन कोशिश कर
के बाद भी
byte[] bytes;
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter serializer =
new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
System.IO.MemoryStream memStream = new System.IO.MemoryStream();
serializer.Serialize(memStream, obj);
bytes = CompressionHelper.CompressBytes(memStream.ToArray());
memStream.Dispose();
return bytes;
अद्यतन (मेरा तालिकाओं के बहुत सारे, 15 arround और तार के बहुत सारे और स्तंभ होते हैं) एक unmanagedMemoryStream के लिए serialize LOH एक ही आकार तक कूदता है। ऐसा लगता है कि कोई फर्क नहीं पड़ता कि मैं क्या करता हूं, जिसे इस बड़ी वस्तु को क्रमबद्ध करने के लिए बाइनरीफॉर्मेटर कहा जाता है, वह LOH का उपयोग करेगा। प्री-आवंटन के लिए, यह बहुत मदद नहीं करता है। मान लें कि मैं पूर्व-आवंटित करता हूं कि मैं 100 एमबी प्रीलाकेट करता हूं, फिर मैं धारावाहिक करता हूं, यह 170 एमबी का उपयोग करेगा। इसके लिए कोड यहाँ है। उपरोक्त कोड
BinaryFormatter serializer = new BinaryFormatter();
MemoryStream memoryStream = new MemoryStream(1024*1024*100);
GC.Collect();
serializer.Serialize(memoryStream, assetDS);
GC.Collect() बीच में वहाँ LOH प्रदर्शन काउंटर अद्यतन करने के लिए बस है की तुलना में और भी आसान। आप देखेंगे कि यह सही 100 एमबी आवंटित करेगा। लेकिन फिर जब आप धारावाहिक कहते हैं, तो आप देखेंगे कि ऐसा लगता है कि 100 के शीर्ष पर जो आप पहले ही आवंटित कर चुके हैं।
क्या कोई ऐसा चीज है जो आप LOH को बफर के रूप में उपयोग करने के बजाय सीधे 'स्ट्रीम' पर क्रमबद्ध करने के लिए कर सकते हैं? –