クライアントによって逆シリアル化されるいくつかの大きなオブジェクト(〜115Mb)をクライアントに送信する.NET4WCFサービスがあります。オブジェクトが最初に入ると、正常に逆シリアル化されます。ただし、後続のすべての呼び出しは。をスローしOutOfMemoryExceptionます。すべてがブロックIDisposablesに包まれていることを確認しました。BinaryFormatterのメモリ不足例外の逆シリアル
化やMemoryStreamからの逆シリアル化がC#でOutOfMemory例外をスロー
usingするなど、これに類似した他の質問を見てきました。SimonHewittのOptimizedSerializerの使用など、人々が推奨するソリューションのいくつかを試しました。ただし、最終的には、オブジェクトの逆シリアル化に依然依存しています。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)
別の方法でBinaryFormatter作業して使用しない方法はありますか、それともメモリをより適切に管理するStringBuilderための優れた代替手段がありますか?BinaryFormatter