【问题标题】:Memory issues migrating large CoreData datastores on iPhone在 iPhone 上迁移大型 CoreData 数据存储时出现内存问题
【发布时间】:2011-06-20 00:28:48
【问题描述】:

我的应用程序下面有一个可能非常大的 CoreData 数据存储(可能很容易超过 30MB)。在使用自动迁移 (addPersistentStoreWithType:configuration:URL:options:error:) 时,我开始注意到内存问题,因此我开始研究迁移存储的较小部分的方法,以避免一次迁移所有内容时发生的所有 CoreData 对象堆积。

这在“多次传递”部分的official documentation 中进行了讨论,但是看起来他们建议的方法是按实体类型划分您的迁移,即制作多个映射模型,每个映射模型迁移一个子集来自完整数据模型的实体类型。

唯一的问题是 - 如果一种实体类型是您的数据存储的主要部分怎么办?按照 Apple 推荐的方法,整个实体类型仍将在一次迁移中完成,并且内存问题可能会持续存在。

是否有任何技术可用于实际迁移特定类型的实体子集,以保证在尝试全部迁移时不会耗尽内存?

提前感谢您的帮助。

编辑:在进行更多挖掘之后,我发现 Apple 推荐的将数据库拆分为实体类型实际上只适用于非相关实体(如 discussed here),因此解决问题的可能性更小一个比我最初写这篇文章时想象的真实世界的数据库。

我开始认为实际上通过 NSMigrationManager 完成的 CoreData 迁移现在根本无法扩展,如果您希望能够迁移,基本上不能拥有大于约 20-30MB 的数据库它在当前一代的 iOS 设备上。唯一可行的方法似乎是完全短路所有 NSMigrationManager / NSMappingModel 东西,并在代码中完全自定义迁移。如果真的是这样的话,这似乎是苹果方面的一个巨大疏忽。

【问题讨论】:

    标签: iphone core-data memory-management migration


    【解决方案1】:

    http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmLightweight.html#//apple_ref/doc/uid/TP40008426-DontLinkElementID_1 中所述,我能够通过利用“轻量级”迁移在短期内解决此问题。

    诀窍是在您手动调用迁移时提取专门用于 SQLite 存储类型的 NSMigrationManager 子类,如该页面上的最后一个代码示例所示。

    这不是一个通用的修复方法,因为它仅在数据存储中的架构更改足够简单以至于可以进行轻量级迁移的情况下才有效。当您处理非平凡的映射时,仍在等待 Apple 的回复,说明推荐的解决方案是什么。

    【讨论】:

    • 从 Apple 那里得到回复,他们的解决方案是……嗯……自己动手。因此,基本上,如果您的应用程序中有一个大型数据库,请尽一切努力确保您的迁移可以通过推断/轻量级模型完成。布莱尔。
    猜你喜欢
    • 1970-01-01
    • 2021-05-12
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2015-10-30
    • 2014-05-31
    • 2017-06-02
    相关资源
    最近更新 更多