2

我有一个将产品存储在核心数据文件中的应用程序。这些产品包括作为“可转换”数据的图像。现在我尝试使用轻量级迁移添加一些属性。当我用一个小型数据库对其进行测试时,它运行良好,但是当我使用一个接近 500 MB 的非常大的数据库时,应用程序通常会因为内存不足而崩溃。有谁知道如何解决这个问题?

提前致谢!

4

1 回答 1

6

您必须使用其他迁移选项之一。自动轻量级迁移过程使用起来真的很方便。但它有一个缺点,即一次将整个数据存储加载到内存中。两份,真的,一份用于迁移前,一份用于迁移后。

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

如果不是这种情况... Apple 建议使用多个映射模型的多通道技术。如果您有多种实体类型会影响大型数据存储大小,那么它可能会有所帮助。基本上,您最终会在不同的通道中迁移不同的实体类型,因此您可以避免一次加载所有内容的开销。

如果不是这种情况(例如,膨胀都来自同一实体类型的实例),那么是时候编写您自己的自定义迁移代码了。这将涉及设置两个 Core Data 堆栈,一个使用现有数据,一个使用新模型。运行现有数据存储,在新存储中创建新对象。如果您分批执行此操作,您将能够控制内存。一般的方法是:

  1. 在新模型中创建新实例并仅复制属性。您还不能设置关系,因为新数据存储中可能不存在相关对象。保留一个从旧存储到新存储的可变字典映射NSManagedObjectIDs,以供下一步使用。为了保持低内存使用:
    • 创建目标存储对象后,立即使用refreshObject:mergeChangeswithNO作为第二个参数释放源对象的内存。
    • 每 10 个实例(或 50 个,或其他)保存目标托管对象上下文的更改,然后保存reset它。间隔是一种平衡行为——太频繁,你会不必要地放慢速度,太少,内存使用会增加。
  2. 做第二遍,在目标商店中建立关系。对于每个源对象,
    • 使用您创建的对象 ID 映射找到相应的目标对象
    • 遍历源对象的关系。对于每一个,找到相应的目标对象,同样使用对象 ID 映射。
    • 根据结果​​设置目标对象的关系。

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

于 2013-02-15T18:12:11.490 回答