私はクライアントにデシリアライズされた大きなオブジェクト(〜115Mb)をクライアントに送信している.NET 4 WCFサービスを持っています。最初にオブジェクトが入ってくると、それはデシリアライズされます。ただし、以降の呼び出しではすべてOutOfMemoryException
が返されます。私はIDisposables
のすべてがusing
ブロックに包まれていることを確認しました。私はBinaryFormatter outofmemory exception deserialization とDeserialize from MemoryStream throws OutOfMemory exception in C# のようなこれに似た他の質問を見てきました。私はSimon Hewitt's Optimized Serializerを使用するなど、人々が推奨しているソリューションのいくつかを試しました。しかし、結局のところ、オブジェクトを逆シリアル化するために彼は依然としてBinaryFormatter
に依存しています。BinaryFormatter.DeserializeからのOutOfMemory例外(内部StringBuilder呼び出しから)
私は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