进行核心数据迁移时内存不足

Kam*_*tka 8 iphone multithreading core-data iphone-sdk-3.0 core-data-migration

我正在两个版本的应用程序之间迁移CoreData模型.我在之前的版本中将二进制数据存储为blob,我想将它们从blob中取出以获得性能.我的问题是,在迁移过程中,Core Data似乎将所有内容加载到内存中导致内存不足警告,然后导致我的应用程序被杀死.

Apple文档建议如下:http: //developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmCustomizingTheProcess.html#//apple_ref/doc/uid/TP40005510-SW9

但是,它似乎依赖于大对象应用不同映射的事实.在我的例子中,所有对象基本相同,并且必须对每个对象应用相同的映射.在这种情况下,我没有看到我如何应用他们的技术.

我应该如何使用非常大的对象处理迁移?

Jac*_*ues 3

我猜想除了从 blob 中提取数据之外,您还需要进行一系列更改。我的建议是分几个阶段进行迁移。我在这里大声思考,所以也许可以改进这一点。这要求您使用 SQLite。

为了实现这一点,您将拥有模型的三个版本:

  1. 原型号
  2. 删除了属性的模型(并且可能添加了特殊的唯一 ID - 见下文)
  3. 包含您所做的所有更改的模型,包括添加新实体和替换属性的关系

这样做的原因是从版本 1 到版本 2 的过渡应该可以通过自动轻量级迁移来实现。在这种情况下,Core Data 不需要将任何内容加载到内存中——它只是发出 SQL 语句来直接对数据库进行更改。

因此,您首先使用旧模型版本设置持久性存储协调器。加载数据后,检查要迁移的所有对象,提取二进制属性,然后以某种方式将其写入磁盘。您可以使用带有批处理和定期自动释放池耗尽的提取请求,以确保不会为临时对象使用太多内存。将数据存储到使用 NSCachesDirectory 获得的目录中。显然,您会希望以某种方式存储数据,以便将数据与对象的 ManagedObjectID 相关联。

然后,您关闭所有内容并要求 Core Data 将存储从版本 1 迁移到版本 2。有关详细信息,请参阅此链接。使用版本 2 打开商店。

您可能需要添加一个步骤,为每个对象分配某种唯一 ID,因为我不确定 Core Data 在执行非轻量级迁移时是否维护对象 ID。如果您需要这样做,您的版本 2 模型会向您从中取出二进制数据的对象添加一个新属性,该属性是可选的或设置了默认值。由于轻量级迁移不应更改 ManagedObjectID,因此您可以将新的唯一 ID 的映射保存到两段前与二进制数据一起保存的 ManagedObjectID。

保存数据并关闭商店。

打开商店并从版本 2 迁移到版本 3,这基本上应该是您在发布问题之前已经编写的代码。商店打开后,添加您从版本 1 商店保存的所有对象,并使用您在此过程中保存的数据设置关系。

很简单,对吧?