0

サーバーでこのエラーが発生しています。

System.InsufficientMemoryException、mscorlib、バージョン = 4.0.0.0、カルチャ = ニュートラル、PublicKeyToken = b77a5c561934e089

536870912 バイトのマネージ メモリ バッファの割り当てに失敗しました。使用可能なメモリ量が少ない可能性があります。

これは、最後のステートメントreturn myCollectionの後に発生します。myCollection が約 45k アイテムの場合。

サーバー構成:

<binding name="LargeTCPBinding"
         closeTimeout="00:30:00"
         openTimeout="00:30:00"
         receiveTimeout="01:00:00"
         sendTimeout="01:00:00"
         hostNameComparisonMode="StrongWildcard"
         maxBufferPoolSize="2147483647"
         maxReceivedMessageSize="2147483647"
         maxBufferSize="2147483647">
  <readerQuotas maxDepth="2147483647"
                maxStringContentLength="2147483647"
                maxArrayLength="2147483647"
                maxBytesPerRead="2147483647"
                maxNameTableCharCount="2147483647" />
  <security mode="Transport">
    <transport clientCredentialType="Windows" />
  </security>
</binding>

基本的なメモリ プロファイリングGC.GetTotalMemory(false)を実行しましたが、コレクションをメモリに格納した後の差は約 170 MB です。

コレクションを返した後に例外が発生します(したがって、送信のバッファリング中に発生するようです)。

wcf 接続構成をStreamedに切り替えると、例外は修正されますが、呼び出しは 25 秒から 1:05 分になります。

そのコレクションはそれほど大きくないので、ここで何が起こっているのかを理解しようとしています. これは、WCF 4.0、64 ビット CPU で実行されています。

4

1 に答える 1

1

ここで重要なのは、コレクションの SIZE ではなく、オブジェクト グラフの COMPLEXITY です。コレクションに多くのフィールドやプロパティを持つ参照型が含まれている場合、これはより複雑で深いグラフになります。

WCF が応答を送信する前に、オブジェクト グラフをバイナリにシリアル化し、ネットワーク経由で送信し、クライアントがそれを逆シリアル化する必要があります。

バッファリングとは、コレクションがメモリ内の構造にシリアル化され、1 つの大きなチャンクとして送信されることを意味します。ストリーミングとは、コレクションがシリアル化されたまま送信されることを意味します。

オブジェクトは大きくないかもしれませんが、データ用に作成された SOAP エンベロープや XML 表現などが原因で、オブジェクトのシリアル化された表現が非常に大きくなる場合があります。

これが、Streamed が問題を解決する理由です。buffered は、メモリ内のシリアル化された形式でオブジェクト グラフ全体を一度に表すことはできません。

于 2013-06-12T22:03:09.413 に答える