使用 CoreData 与内存中的内存占用优势不明显/不明显 - 意见?

Posted

技术标签:

【中文标题】使用 CoreData 与内存中的内存占用优势不明显/不明显 - 意见?【英文标题】:Memory footprint benefits of using CoreData vs in-memory not evident/obvious - opinions? 【发布时间】:2010-08-18 22:10:14 【问题描述】:

我有一个应用程序当前将所有状态保存在内存中。它从服务器获取大量 JSON 信息,然后将 JSON 值保存在内存中。每个JSONObject 可以是~300 字节,并且可以有数千个这样的对象。 我只是使用这些数据来填充UITableView

为了更好地处理大量的 aata,我修改了我的代码以从服务器获取数据并使用 CoreData 存储它。 JSON 对象可以表示为简单实体,每个实体具有 3 个 NSString 属性和 1 个 int32 属性。我创建了一个NSFetchedResultsController 用作UITableView 的数据源。我的假设是这将减少我的应用程序的常驻内存使用量(我假设NSFetchedResults 控制器有效地管理内存以不保存未显示在视图中的实体,而不是保存我的所有状态在内存中)。 出于本次讨论的目的,假设我的应用在每次运行时都会清除 CoreData 存储并重新获取所有数据。

当我使用 Instruments 中的 VM Tracker 测量驻留内存和虚拟大小的变化时,我注意到这两个值几乎保持不变。事实上,我的应用程序的基于 Core-Data 的版本似乎比我将所有内容都完全存储在内存中时使用了更多的内存。

虽然这可能是真的,但我不知道为什么会这样。有什么解释吗? 从我所说的关于我的应用程序的情况来看,听起来我不想费心坚持使用 CoreData,为什么?

【问题讨论】:

我真的不会太担心几兆内存。 @tc 我会担心几兆内存。 我在这里写了一个快速操作方法:crazyviraj.blogspot.com/2010/09/… 【参考方案1】:

如您所见,Core Data 可以使用更多内存,如果有内存可用的话。但是,Core Data 的好处之一是当您遇到内存不足的情况时。当这种情况发生时,Core Data 会自动尽可能地减少自己的内存占用。

要考虑的另一件事是,您是否让 Core Data 对这些对象进行了故障处理?如果您要拉入 1000 个对象并显示其中的 10 个,那么其他 990 个应该处于故障状态,因此占用的内存更少。

我会运行 Core Data 工具,并确保您不会意外地实现所有这些对象并无意中导致您的内存使用量高于所需的水平。

更新

听起来您正在导入此数据,然后如果您没有看到任何错误发生,则没有正确刷新核心数据。

假设您在首次启动时加载此数据(顺便说一句,我不会这样做,我会预加载应用程序并完全避免使用 plist 文件),您想在加载后在 NSManagedObjectContext 上调用 -reset是完整的,因此任何未使用的对象都会从内存中清除。然后当数据返回到内存(使用中)时,它会正确地出错。

最后,确保您使用的是 SQLite 存储。否则这一切都没有实际意义。

【讨论】:

这听起来很有希望 - 谢谢马库斯。您能否解释/提供“错误这些对象”的含义?我怀疑我没有这样做,但我不确定。我保存我的实体,然后使用 NSFetchedRequestController 获取它们,该控制器的 NSFetchRequest 没有谓词。我认为 NSFetchedRequestController 做了正确的事情,但我对此太陌生了,无法确定。 顺便说一句,我没有实体之间的关系。用 SQL 术语来说,这实际上只是一组简单的表,每行有 4 列,没有关系约束。 嗯,我使用 Core Data Instrument 进行了跟踪,没有发现任何错误。不确定我需要更改什么 - 我对 executeFetch 的唯一调用是通过 NSFetchedResultsController 的 performFetch: 方法。 cid-663ff372702aa2de.office.live.com/self.aspx/Public/… 用于跟踪,以防万一。 如果您在模拟器中运行,“模拟内存警告”是一种检查方式。 谢谢马库斯。是的,我正在使用 SQLite。您的更新确实有帮助 - 调用 reset 会使行在显示时出错。这是否也意味着我想在收到内存警告时致电reset?我希望 FRC 会这样做,但它不会保留 NSManagedContext,所以我不知道它会如何。

以上是关于使用 CoreData 与内存中的内存占用优势不明显/不明显 - 意见?的主要内容,如果未能解决你的问题,请参考以下文章

与基于摇摆的图表相比,为啥基于 javafx 的图表占用更多内存

c++中字符串是如何分配内存的?

可道云内存占用

将大型CSV流写入内存中的ZipOutputStream会占用与CSV或潜在zip的大小相同的内存吗?

iOS uiimage内存占用大小计算

C题:为啥char实际上占用了4个字节的内存?