5

मेरे पास एक .NET 4 WCF सेवा है जो ग्राहक को कुछ बड़ी ऑब्जेक्ट्स (~ 115 एमबी) भेज रही है जो क्लाइंट द्वारा deserialized मिलता है। पहली बार जब ऑब्जेक्ट आता है तो ठीक से deserializes। हालांकि, बाद के सभी कॉल OutOfMemoryException फेंक देते हैं। मैंने यह सुनिश्चित करने के लिए जांच की है कि मेरे सभी IDisposablesusing ब्लॉक में लिपटे हैं। मैंने BinaryFormatter outofmemory exception deserialization और Deserialize from MemoryStream throws OutOfMemory exception in C# जैसे अन्य प्रश्नों को देखा है। मैंने कुछ समाधानों की कोशिश की है जिन्हें लोगों ने Simon Hewitt's Optimized Serializer का उपयोग करने की सिफारिश की है। हालांकि, अंत में, वह वस्तुओं को deserializing के लिए अभी भी BinaryFormatter पर निर्भर करता है।बाइनरीफॉर्मेटर से आउटऑफमेमरी अपवाद। अपने आंतरिक स्ट्रिंगबिल्डर कॉल से आने वाले डीरिएरियलाइज

मैंने OutOfMemoryException पकड़ा और स्टैक ट्रेस को देखा (नीचे देखें)। यह निशान StringBuilder कक्षा में स्मृति उपयोग के साथ किसी समस्या से उत्पन्न होता है। मैंने StringBuilder के बारे में अन्य लेख पढ़े हैं (लम्बाई * 2) एल्गोरिदम के कारण स्मृति समस्याओं का कारण बन सकता है जब वे अधिक स्थान की आवश्यकता होती है।

at System.Text.StringBuilder.ToString()  
at System.IO.BinaryReader.ReadString()  
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectString(BinaryHeaderEnum binaryHeaderEnum)  
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()  
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)  
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)  
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream) 

वहाँ एक रास्ता अलग तरह से काम करने के लिए और StringBuilder का उपयोग नहीं या वहाँ है कि स्मृति बेहतर प्रबंधन करता BinaryFormatter के लिए एक अच्छा विकल्प है BinaryFormatter प्राप्त करने के लिए है?

+0

पहले कॉल में भी वही आकार का ऑब्जेक्ट था? क्या आप कुछ कोड पोस्ट कर सकते हैं, बस मामले में .. –

+0

हां, दोनों मामलों में यह वही प्रतिक्रिया थी। मैंने सुनिश्चित करने के लिए हर बार सटीक बाइट आकार की जांच की। मैं देखूंगा कि क्या मैं कुछ कोड खींच सकता हूं, लेकिन यह काफी लंबा है। – MrWuf

उत्तर

1

मैं उस आकार के लिए बाइनरीफॉर्मेटर का उपयोग करने की अनुशंसा नहीं करता (वास्तव में यदि आप बाइनरीफॉर्मर का उपयोग नहीं कर रहे थे तो शायद यह बहुत छोटा होगा)। यदि यह टैब्यूलर डेटा या कुछ बाधाओं जैसे किसी परिपत्र संदर्भों और अन्य बाधाओं के साथ काफी सरल डेटा है, तो एक साधारण द्विआधारी लेखक के साथ अपना स्वयं का द्विआधारी क्रमबद्धरण रोल करना, या protobuf-net या json.net जैसे शेल्फ सीरियलाइज़र से कुछ का उपयोग करना अधिक कॉम्पैक्ट होना चाहिए और काफी तेज़

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

  • कोई संबंधित समस्या नहीं^_^