gpt4 book ai didi

ios - 迁移大型 Core Data 数据库崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:18:32 25 4
gpt4 key购买 nike

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

提前致谢!

最佳答案

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

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

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

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

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

一边做,一边思考为什么您的数据存储如此之大。您是否在数据存储中存储了一堆二进制数据 block ?如果是这样,请确保您在新模型中使用“允许外部存储”选项。

关于ios - 迁移大型 Core Data 数据库崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14899436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com