核心数据 NSManagedObject:最大属性数?

Posted

技术标签:

【中文标题】核心数据 NSManagedObject:最大属性数?【英文标题】:Core Data NSManagedObject: Max Number of Attributes? 【发布时间】:2012-11-28 19:56:40 【问题描述】:

我想知道是否有任何一个 NSManagedObject 子类应具有的最大属性数的指南。我仔细阅读了 Apple 的文档,但没有提到性能开始下降的限制。

我确实在 Xcode 中看到了一个编译器标志选项,当 NSManagedObject 具有超过 100 个属性时会提供警告,但我找不到任何文档。这里有没有人有使用具有大量属性的 Core Data MO 的经验?

我关注的是性能,而不是内存使用情况。在我的应用程序中,只有大约 10-20 个具有大量属性的 MO 实例,而且我在 OS X 而不是 ios 上进行开发,因此内存使用不是一个因素。但是,如果有一点性能(尤其是在出现故障时)开始下降,我现在想知道,以便我可以相应地更改我的数据模型的结构。

谢谢!

【问题讨论】:

【参考方案1】:

Each attribute gets mapped to a table column,如果您使用的是 SQLite 后备存储。 SQLite 对可以使用的列数有硬性限制(默认为 2000,尽管它是编译时可配置的,因此 Apple 的实现可能会有所不同)和 they recommend not using more than one hundred。这很可能是 Xcode 警告将其阈值设置为 100 的原因。

关于限制的同一个链接页面还指出,有一些 O(N^2) 算法,其中 N 是列数,因此,听起来您通常应该避免使用大数字。

对于其他文件格式,我不知道有任何限制或建议。但我会期待类似的事情 - 即其中可能有一些算法是 O(N^2) 或更糟,所以你想避免成为一个不常见的边缘情况。

【讨论】:

谢谢。我使用 XML 作为后备存储,所以我不需要担心 SQLite 限制。听起来这确实是编译器标志存在的原因,这绝对是有帮助的。我预计不会需要超过 150 个属性,所以我想我会没事的。我感谢这些链接!【参考方案2】:

即使在 iOS 上我也没有遇到过。性能的最大限制因素是NSPersistentStoreCoordinator 中的缓存大小,这在 Mac OSX 上相当大。

如果您的属性是字符串、数字、日期等(即不是二进制数据),那么在您开始看到性能下降之前,您可能拥有大量属性。如果您正在使用二进制数据,那么我会提醒您不要破坏缓存并考虑将二进制数据存储在 SQLite 之外。最新版本的操作系统甚至可以为您自动执行此操作。

但是,我会质疑您为什么要这样做。肯定有一些属性会不如其他属性那么重要,并且可以抽象为一对一关系另一端的子实体?

【讨论】:

以上是关于核心数据 NSManagedObject:最大属性数?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 - 遍历 NSManagedObject 的属性

为啥我不能在 NSManagedObject 子类计算属性中使用关系? (核心数据,迅速)

NSManagedObject 的设置属性阻止了核心数据中的 iPad UI'

核心数据:访问 NSManagedObject 属性时应用程序崩溃

Swift 从实体(核心数据)获取特定的 NSManagedObject

您如何获得一个新的核心数据实体属性以反映在该实体的 NSManagedObject 中?