【发布时间】:2014-01-27 03:34:01
【问题描述】:
我有一个应用程序,它不断地从 TCP/IP 端点接收 XML 消息流。收到每条消息后,应用程序将其内容消化成一组核心数据实体。这是通过三个上下文结构实现的:
- 主(专用队列)
- 主(主队列 -> 主)
- 流(私有队列 -> 主队列)
这种安排使流处理远离主线程。应用程序通常每秒或每两秒钟接收 10 到 150 条消息。 Stream 上下文的保存发生在每条消息被解构和持久化之后。在 A6 级别的设备上,CPU 使用率通常不足 15%。
然而,我的问题是记忆。如果我将 NSFetchedResultsController 连接到 Main 上下文,我会在消息到达时得到很好的消息流。但是,如果我进行分析,我会注意到我的 NSManagedObject 计数逐渐增加。最终内存压力会导致应用程序终止。
经过 12 分钟的分析,该应用已使用 6300 条 XML 消息并解析了 121,000 个属性。属性消耗 7.8MB,消息消耗 438KB,应用程序总大小现在为 54MB。显然这是不可持续的。
仪器指出所有对象仍处于活动状态。在互联网上闲逛让我相信我可能有一个保留周期,导致对象不会出错。但是,使用“refreshObject”的建议在文档中并不清楚它是否适用于此。
一旦接收到 XML,就会创建一个 Message 实体。接下来,使用 XML 的根节点作为它的名称和相关的位来创建一个 Type 实体。类似地,对于这些元素的每个元素和子元素以及 XML 的任何内联属性,都会创建一个属性元素。这是有趣的部分,因为它引用了消息(用于所有属性的平面表示)以及与自身的分层 childProperties 关系。在这个过程结束时,上下文被保存,主上下文拾取它,FRC 显示新行。
一个想法是在保存每几百条消息后重置 Stream 上下文。如果我断开 FRC,我可以基本保持水平 - 但是这感觉不对,并且在我重新连接 FRC 时并不能解决问题。
任何想法都将不胜感激。
【问题讨论】:
-
你读过THIS(包括关于插入对象的cmets)吗?