2

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

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

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

谢谢!

4

2 回答 2

5

如果您使用 SQLite 后备存储,则每个属性都会映射到表列。SQLite 对您可以使用的列数有硬性限制(默认为 2000,尽管它是编译时可配置的,因此 Apple 的实现可能会有所不同),并且他们建议不要使用超过 100 个. 这很可能是 Xcode 警告将其阈值设置为 100 的原因。

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

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

于 2012-11-29T06:18:33.313 回答
3

并不是说我什至在 iOS 上也遇到过。性能的最大限制因素是NSPersistentStoreCoordinatorMac OSX 上的缓存大小相当大。

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

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

于 2012-11-28T20:20:11.837 回答