迁移大型Core Data数据库崩溃

我有一个将产品存储在核心数据文件中的应用程序。 这些pruducts包括图像作为“可变形”的数据。 现在我尝试使用Lightweight迁移来添加一些属性。 当我用一个小型的数据库进行testing的时候,它工作的很好,但是当我用了一个非常大的,有近500MB的应用程序时,通常会因为内存不足而崩溃。 有谁知道如何解决这个问题?

先谢谢了!

您将不得不使用其他迁移选项之一。 自动轻量级迁移过程非常方便使用。 但它有缺点,它一次加载整个数据存储到内存中。 两份,真的是一份在迁移之前,一份在之后。

首先,是否可以重新创build或重新下载这些数据? 如果是这样,您可能可以使用从旧版本到新版本的自定义映射模型。 使用自定义映射模型,您可以指示某些属性不会被迁移,从而通过丢弃该数据来减less内存问题。 然后,当迁移完成时,重新创build或重新下载该数据。

如果情况并非如此……苹果build议使用多重映射模型的多重传递技术。 如果您有多个对大数据存储大小有贡献的实体types,可能会有所帮助。 基本上你最终会迁移不同的实体types在不同的通行证,所以你避免了一次加载所有的开销。

如果情况并非如此(例如,膨胀都来自相同实体types的实例),那么现在是编写您自己的自定义迁移代码的时候了。 这将涉及build立两个核心数据堆栈,一个与现有数据和一个与新模型。 运行现有数据存储,在新存储中创build新对象。 如果你批量执行这个操作,你可以控制内存。 一般的做法是:

  1. 在新模型中创build新实例并复制属性 。 您不能build立关系,因为相关的对象可能不存在于新的数据存储中。 保留一个可变的字典映射NSManagedObjectID从旧的存储到新的,用于下一步。 为了保持内存使用低:
    • 只要创build了目标存储对象,就可以通过使用refreshObject:mergeChanges (对于第二个参数为NO refreshObject:mergeChanges源对象的内存。
    • 每10个实例(或50个,或其他)保存目标pipe理对象上下文中的更改,然后resetreset 。 这个时间间隔是一个平衡的行为 – 经常这样做,你会不必要的放慢速度,做得太less,记忆力也会上升。
  2. 在目标商店中build立关系的第二步。 对于每个源对象,
    • 使用您创build的对象标识映射查找相应的目标对象
    • 运行源对象的关系。 对于每一个,find相应的目标对象,也使用对象标识映射。
    • 根据结果​​设置目标对象的关系。

当你在这个时候,考虑一下你的数据存储为什么这么大。 你是否在数据存储中存储了一堆二进制数据blob? 如果是这样,请确保您在新模型中使用“允许外部存储”选项。