代码之家  ›  专栏  ›  技术社区  ›  Sean

核心数据占用了大量内存

  •  2
  • Sean  · 技术社区  · 16 年前

    alt text http://dl.dropbox.com/u/545670/thedatamodel.png

    这有点奇怪,但其想法是该应用程序将一个人可能拥有的多个帐户/身份管理到一个单一的消息传递系统中。每个帐户都与系统上的一个用户关联,并且每个消息都可能被查看/发送到多个帐户(但它们具有全局唯一的ID,因此具有messageID属性,该属性在导入时用于获取可能已由先前会话下载和导入的消息对象)。

    该应用程序是从每个帐户的角度使用的——我的意思是,你选择要使用的帐户,然后在窗口中从该帐户的角度查看消息和内容。因此,我将邮件附加到帐户,这样我就可以轻松地通过如下方式获取应该显示的邮件:

        fetch.fetchPredicate = [NSPredicate predicateWithFormat:@"%@ IN accounts", theAccount];
        fetch.sortDescriptors = [NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO]];
        fetch.fetchLimit = 20;
    

    这似乎是一种正确的设置方式,因为消息在帐户之间共享,如果消息被标记为已被一个帐户读取,我希望它被另一个帐户读取,依此类推。

    无论如何,在所有这些设置之后,最大的问题是内存使用似乎有点疯狂。当我设置一个测试用例,将数百条消息导入到系统中,并定期重新获取(使用上面提到的获取)并将它们显示在列表中(只有最后20条被列表引用)时,内存就会变得疯狂。60MB。。70MB。。。100MB。。等

    我追踪到帐户和消息之间的多对多关系。即使启用了垃圾收集,托管对象仍被帐户的messages关系属性强烈引用。我之所以知道这一点,是因为我在消息实例的finalize中放置了一个日志,但从未看到它-但是如果我定期重置上下文或在account对象上执行refreshObject:mergeChanges:操作,我会看到finalize消息和内存使用保持相当一致(虽然仍在增长,但考虑到我正在导入内容,这是意料之中的)。问题是,我不能一直重置上下文或account对象,因为这会让观察account对象其他属性的观察者感到混乱!

    我可能只是建模错误或思考错误,但我反复阅读,将核心数据视为对象图而不是数据库是很重要的。我想我已经在这里做了,但它似乎在制造麻烦。我该怎么办?

    2 回复  |  直到 16 年前
        1
  •  2
  •   Peter Hosey    16 年前

    使用对象图工具。它会告诉你一个物体的所有所有权。

        2
  •  1
  •   Dana    16 年前