【问题标题】:WCF - Memory problems when deserializing a large streamed objectsWCF - 反序列化大型流对象时的内存问题
【发布时间】:2010-07-08 14:56:47
【问题描述】:

这是我的情况 - 我有一个简单的对象模型。在根目录下,有一个 Report 对象。报告有一系列文档。每个文档都有一组章节和页面。这些对象中的每一个都有 4 或 5 个属性(原语 - 字符串和整数)。它看起来像这样:

  • 报告
    • 列表
      • 列表
      • 列表

够简单吧?

这是我的问题。在一个长时间运行的过程完成后,我有一个报表对象,它通常有大约 5000 个 Document 对象。每个 Document 大约有 200 个 Chapter 对象和 200 个 Page 对象。

换句话说,Report 对象具有相当大的内存占用。 5,000 个文档、1,00,000 个章节和 1,000,000 页。如果我将对象序列化为内存流,它可以大到 80MB。

问题是我必须通过电线移动这个对象(是的,这是必须的)。

这就是我需要帮助的地方!

我的第一次尝试只是尝试使用标准 WCF 服务通过网络移动整个对象,该服务具有装饰有 DataContract/DataMember 属性的对象模型。考虑到图中对象的数量,以及序列化对象的总体大小(因为 WCF 正在创建 XML),这是不可行的。即使将 maxReceivedMessageSizemaxItemsInObjectGraph 设置为可能的最高值也无法完成工作。另外,这是一个缓冲请求,这似乎不是一个好主意。

我的第二次尝试是使用 System.ServiceModel.Channels.Message 实例创建 WCF StreamedRequest。这似乎可以毫无问题地通过网络获取大型 Report 对象。请求是流式传输的,因此传输不是问题。但是,问题是我需要在 WCF 服务接收到对象时反序列化它。我尝试了几种不同的方法(全部基于流),但存在一致的问题。反序列化对象使 W3WP 的内存从 115,000K(正常)增加到超过 2.2GB!这只是反序列化 1 个 Report 对象。加上反序列化非常慢!

我不知道内存中的 2.2GB 峰值是否是由于像 maxReceivedMessageSize 这样的属性的 WCF 设置,或者是否在反序列化过程中存在一些泄漏(我目前正在使用 DataContractSerializer )。不管是什么,我都被卡住了。

所以,你有它 - 一个大对象需要穿过电线然后被反序列化,而不需要永恒并消耗所有可用内存。

有人有什么建议吗?我对几乎任何解决方案都持开放态度;我不在乎它有多么不寻常或有创意。唯一的限制是:

  1. 需要托管在 IIS 中
  2. 需要在内存消耗方面相当高效。

谢谢大家!

【问题讨论】:

  • 哇! 2.2 字节!!您到底要如何以及为什么要传输所有这些数据.....您是否有机会将其写入磁盘或其他东西?其他任何事情都会a)非常慢,b)可能非常脆弱,可能会在这里和那里中断,c)反序列化将总是因为大小而很慢......
  • 没有机会瘦下来吗?例如。仅传输每个文档的前 200 个字节等,并在您真的需要时提供检索整个内容的选项??
  • 马克,记住,这不是 2GB 的数据。它是 80MB。只是反序列化 80MB 的对象时内存使用量暴增到 2GB。我不会在网络上移动 2GB……至于缩小对象,这显然是个好主意。我正在研究如何通过 Document 集合进行分页,但这比您想象的要难。
  • 我在一个项目中也遇到过这种问题。我想出的解决方案是使用带有数据压缩的 NetTcpBinding。我不确定目前是否有更好的 httpBinding 选项。试试这个链接可能会有帮助:msdn.microsoft.com/en-us/library/ms733742.aspx

标签: .net wcf memory-management serialization


【解决方案1】:

我会把它分成多个调用。第一个调用是创建报表并将其持久化并返回标识报表的对象的请求。随后的调用是通过将报告对象传递给另一个方法来请求报告的合理部分。也许要求提供一系列文件。

除非消费者真的需要一次将所有 5000 个文档加载到内存中(这听起来很糟糕),否则您应该能够对各个部分进行分块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多