मेरे पास एक .NET 4 WCF सेवा है जो ग्राहक को कुछ बड़ी ऑब्जेक्ट्स (~ 115 एमबी) भेज रही है जो क्लाइंट द्वारा deserialized मिलता है। पहली बार जब ऑब्जेक्ट आता है तो ठीक से deserializes। हालांकि, बाद के सभी कॉल OutOfMemoryException
फेंक देते हैं। मैंने यह सुनिश्चित करने के लिए जांच की है कि मेरे सभी IDisposables
using
ब्लॉक में लिपटे हैं। मैंने 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
प्राप्त करने के लिए है?
पहले कॉल में भी वही आकार का ऑब्जेक्ट था? क्या आप कुछ कोड पोस्ट कर सकते हैं, बस मामले में .. –
हां, दोनों मामलों में यह वही प्रतिक्रिया थी। मैंने सुनिश्चित करने के लिए हर बार सटीक बाइट आकार की जांच की। मैं देखूंगा कि क्या मैं कुछ कोड खींच सकता हूं, लेकिन यह काफी लंबा है। – MrWuf