C# 缓冲时WCF内存不足服务器异常

C# 缓冲时WCF内存不足服务器异常,c#,performance,wcf,memory,C#,Performance,Wcf,Memory,我在服务器上收到此错误 System.InsufficientMemoryException,mscorlib,版本=4.0.0.0, 文化=中性,PublicKeyToken=b77a5c561934e089 未能分配536870912字节的托管内存缓冲区。这个 可用内存量可能较低 这发生在最后一条语句返回myCollection之后。当我收集了大约45k个项目时 服务器配置: <binding name="LargeTCPBinding" closeTimeout="

我在服务器上收到此错误

System.InsufficientMemoryException,mscorlib,版本=4.0.0.0, 文化=中性,PublicKeyToken=b77a5c561934e089

未能分配536870912字节的托管内存缓冲区。这个 可用内存量可能较低

这发生在最后一条语句返回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),将我的集合放入内存后的差异约为170MB

异常发生在返回集合之后(因此它似乎发生在缓冲发送期间)

如果我将wcf连接配置切换到流式,这将修复异常,但通话时间从25秒变为1:05分钟


我只是想了解这里发生了什么,因为这个收藏并没有那么大。这是在WCF 4.0 64位cpu上运行的

这里重要的不是集合的大小,而是对象图的复杂性。如果集合包含具有许多字段和/或属性的引用类型,则这是一个更复杂/更深的图形

在WCF向您发送响应之前,它必须将对象图序列化为二进制,通过线路发送,然后客户端将其反序列化

缓冲意味着将集合序列化为内存中的结构,然后作为一个大数据块发送。流化表示集合在序列化时发送

您的对象可能不大,但它的序列化表示可能相当庞大,这仅仅是因为为您的数据创建了SOAP信封和XML表示等等

这就是为什么Streamed解决了您的问题:buffered不能一次在内存中以序列化形式表示整个对象图