【问题标题】:Core Data and objects queues: Reduce memory usage核心数据和对象队列:减少内存使用
【发布时间】:2014-05-17 15:05:29
【问题描述】:

我需要使用 Core Data 实现对象队列的持久性。唯一的操作是 peek、delete 和 pop。从性能和内存使用的角度来看,有人可以建议最好的方法是什么?可能有数千个对象,我不想将它们全部保存在内存中。

[[DataManager shared] push: myItem1];
[[DataManager shared] push: myItem2];
.....
[[DataManager shared] push: myItem10000];
.....


MyItem* item = [[DataManager shared] peek];
while(item != nil){
   if([self processItem: item]){
      [[DataManager shared] delete: item];
   }else{
      break;
   }
   item = [[DataManager shared] peek];
}

提前致谢。抱歉,如果这是一个愚蠢的问题,我是 Core Data 的新手,据我所知,它与 sqllite 数据存储不同,我不能在 Core Data 中使用 sql 技术。

【问题讨论】:

  • Core Data 怎么样?你的最终目标是什么?
  • 目标是使高性能对象队列数据存储使用低内存。 Core Data 将对象保存在内存中,这意味着如果我推送 1000 个对象,它们将在内存中。当对象被刷新存储时,有什么方法可以释放内存?

标签: objective-c core-data memory-management


【解决方案1】:

Core Data 将对象保存在内存中,这意味着如果我按下 1000 它们将在内存中的对象。

根据您的评论,您可以选择正确的储蓄因素来避免这种情况。我会尽力解释。 假设您有 1000 个对象要保存。您可以决定 保存频率(例如 100),然后调用 reset 来删除特定上下文的对象图。

另外,如果你有很多对象进入内存,但你需要减少内存占用,你可以使用NO参数调用refreshObject:mergeChanges:,将一个对象变成故障。使对象出错意味着清除其内存中的属性值。

希望对你有帮助。

附:我真的建议看看High Performance Core Data

【讨论】:

  • 同时避免使用 XML 存储——不管 refreshObject 是否出错,整个事情都在内存中。 This is also a great link, 因为我没有看到 MOC 有太多收缩......可能不得不尝试大锤方法。
  • 非常感谢,伙计们。优秀的链接。在我的情况下,重置调用完成了这项工作,但我必须将队列实体放到单独的上下文中。
猜你喜欢
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2013-09-22
相关资源
最近更新 更多