我有一个将产品存储在核心数据文件中的应用程序。这些产品包括作为“可转换”数据的图像。
现在我尝试使用轻量级迁移添加一些属性。当我使用一个小型数据库对其进行测试时,它运行良好,但当我使用一个接近 500 MB 的大型数据库时,应用程序通常会因内存不足而崩溃。有人知道如何解决这个问题吗?
先谢谢了!
您必须使用其他迁移选项之一。自动轻量级迁移过程确实用起来很方便。但它有一个缺点,就是它会立即将整个数据存储加载到内存中。实际上是两份副本,一份用于迁移之前,一份用于迁移之后。
首先,这些数据可以重新创建或重新下载吗?如果是这样,您也许可以使用从旧版本到新版本的自定义映射模型。使用自定义映射模型,您可以指示某些属性不会迁移,从而通过丢弃该数据来减少内存问题。然后,迁移完成后,重新创建或重新下载该数据。
如果情况并非如此...Apple 建议使用多个映射模型的多次传递技术。如果您有多种实体类型导致数据存储规模较大,这可能会有所帮助。基本上,您最终会在不同的过程中迁移不同的实体类型,因此您可以避免一次加载所有内容的开销。
If that事实并非如此(例如,膨胀全部来自同一实体类型的实例),那么,是时候编写您自己的自定义迁移代码了。这将涉及设置两个核心数据堆栈,一个包含现有数据,另一个包含新模型。运行现有数据存储,在新存储中创建新对象。如果您批量执行此操作,您将能够控制内存。一般方法是:
- Create new instances in the new model and copy attributes only. You can't set up relationships yet because related objects might not exist in the new data store. Keep a mutable dictionary mapping
NSManagedObjectID
s from the old store to the new one, for use in the next step. To keep memory use low:
- 创建目标存储对象后,请使用以下命令释放源对象的内存
refreshObject:mergeChanges
with NO
对于第二个参数。
- 每 10 个实例(或 50 个,或其他)保存对目标托管对象上下文的更改,然后
reset
它。这个间隔是一种平衡行为——太频繁,你会不必要地减慢速度,太少,内存使用量就会增加。
- Do a second pass where you set up relationships in the destination store. For each source object,
- 使用您创建的对象 ID 映射查找相应的目标对象
- 遍历源对象的关系。对于每个对象,也使用对象 ID 映射来查找相应的目标对象。
- 根据结果设置目标对象的关系。
当你在做的时候考虑一下为什么您的数据存储如此之大。您是否在数据存储中存储一堆二进制数据 blob?如果是这样,请确保您在新模型中使用“允许外部存储”选项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)