我有一个将产品存储在核心数据文件中的应用程序。这些产品包括作为“可转换”数据的图像。现在我尝试使用轻量级迁移添加一些属性。当我用一个小型数据库对其进行测试时,它运行良好,但是当我使用一个接近 500 MB 的非常大的数据库时,应用程序通常会因为内存不足而崩溃。有谁知道如何解决这个问题?
提前致谢!
我有一个将产品存储在核心数据文件中的应用程序。这些产品包括作为“可转换”数据的图像。现在我尝试使用轻量级迁移添加一些属性。当我用一个小型数据库对其进行测试时,它运行良好,但是当我使用一个接近 500 MB 的非常大的数据库时,应用程序通常会因为内存不足而崩溃。有谁知道如何解决这个问题?
提前致谢!
您必须使用其他迁移选项之一。自动轻量级迁移过程使用起来真的很方便。但它有一个缺点,即一次将整个数据存储加载到内存中。两份,真的,一份用于迁移前,一份用于迁移后。
首先,是否可以重新创建或重新下载这些数据?如果是这样,您也许可以使用从旧版本到新版本的自定义映射模型。使用自定义映射模型,您可以指示某些属性不会被迁移,从而通过丢弃该数据来减少内存问题。然后在迁移完成后,重新创建或重新下载该数据。
如果不是这种情况... Apple 建议使用多个映射模型的多通道技术。如果您有多种实体类型会影响大型数据存储大小,那么它可能会有所帮助。基本上,您最终会在不同的通道中迁移不同的实体类型,因此您可以避免一次加载所有内容的开销。
如果不是这种情况(例如,膨胀都来自同一实体类型的实例),那么是时候编写您自己的自定义迁移代码了。这将涉及设置两个 Core Data 堆栈,一个使用现有数据,一个使用新模型。运行现有数据存储,在新存储中创建新对象。如果您分批执行此操作,您将能够控制内存。一般的方法是:
NSManagedObjectID
s,以供下一步使用。为了保持低内存使用:
refreshObject:mergeChanges
withNO
作为第二个参数释放源对象的内存。reset
它。间隔是一种平衡行为——太频繁,你会不必要地放慢速度,太少,内存使用会增加。当你在做的时候,考虑一下为什么你的数据存储这么大。您是否在数据存储中存储了一堆二进制数据块?如果是这样,请确保您在新模型中使用“允许外部存储”选项。