Ios 迁移大型核心数据数据库崩溃

Ios 迁移大型核心数据数据库崩溃,ios,objective-c,xcode,core-data,Ios,Objective C,Xcode,Core Data,我有一个将产品存储在核心数据文件中的应用程序。这些产品包括作为“可转换”数据的图像。 现在我尝试使用轻量级迁移添加一些属性。当我用一个小数据库测试它时,它工作得很好,但是当我使用一个有将近500MB的大数据库时,应用程序通常会因为内存不足而崩溃。有人知道如何解决这个问题吗 提前感谢 您必须使用其他迁移选项之一。自动轻量级迁移过程使用起来非常方便。但它有一个缺点,即它一次将整个数据存储加载到内存中。两份拷贝,一份用于迁移前,一份用于迁移后 首先,是否可以重新创建或下载这些数据?如果是这样,您可能可

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


提前感谢

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

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

如果不是这样的话。。。苹果公司提出了一种使用多种映射模型的多重传递技术。如果您有多个实体类型,这些实体类型会导致较大的数据存储大小,这可能会有所帮助。基本上,您最终会在不同的过程中迁移不同的实体类型,因此避免了一次加载所有内容的开销

如果情况并非如此(例如,膨胀都来自同一实体类型的实例),那么,是时候编写您自己的自定义迁移代码了。这将涉及建立两个核心数据栈,一个包含现有数据,另一个包含新模型。运行现有数据存储,在新存储中创建新对象。如果你分批这样做,你将能够控制内存。一般做法是:

  • 在新模型中创建新实例并仅复制属性。您还无法设置关系,因为新数据存储中可能不存在相关对象。将一个可变字典映射
    NSManagedObjectID
    s从旧存储区映射到新存储区,以便在下一步中使用。要保持低内存使用率:
    • 创建目标存储对象后,立即使用
      refreshObject:mergeChanges
      NO
      作为第二个参数,释放源对象的内存
    • 每10个实例(或50个,或其他)保存对目标托管对象上下文的更改,然后将其重置。时间间隔是一种平衡行为——太频繁会导致不必要的减速,太少会导致内存使用增加
  • 在目标存储中设置关系的地方进行第二次传递。对于每个源对象,
    • 使用创建的对象ID映射查找相应的目标对象
    • 运行源对象的关系。对于每个对象,也使用对象ID映射查找相应的目标对象
    • 根据结果设置目标对象的关系

  • <强>当你在< /强>时考虑为什么你的数据存储如此之大。您是否在数据存储中存储了大量二进制数据块?如果是这样,请确保在新模型中使用“允许外部存储”选项。

    我没有使用核心数据,但我的理解是,它不适合大型数据库,其他一些DB实现可能是更好的主意。也许是MySQL?@Robert-一点也不正确。有些情况下它不适合,但尺寸不是其中之一。而且,CoreData不是DB。HACKIMGOTTER可能想考虑只存储图像的URL,并将图像保存在文档目录中。不知道我是从哪里得到这个主意的。谢谢这个好答案。有人知道这方面的好教程吗?这家伙描述了其中的一部分,但他没有处理关系:对于我们这些不幸认识到最后一个策略是唯一合适的人来说,这是一个伟大的洞察力。但是,我想建议对源实体调用[srcContext refreshObject:srcEntity mergeChanges:NO]只能解决一半的内存问题。对于每个目标对象,您是否会有大约同样多的内存浮动?是的,有一些,但这就是成批执行的原因。定期保存更改并重置目标上下文。这限制了内存的增长,因为您需要定期清除内存。