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

时间:2012-11-28 19:56:41

标签: objective-c macos cocoa core-data

我想知道是否存在任何一个NSManagedObject子类应具有的最大属性数的准则。我仔细阅读过Apple的文档,但没有提到性能开始受到侵蚀的限制。

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

我专注于 性能 ,而不是内存使用。在我的应用程序中,只有大约10-20个MO的实例具有大量属性,我正在开发OS X而不是iOS,因此内存使用不是一个因素。但是如果有一点表现(特别是在出现错误的情况下)开始死亡,我现在想知道,所以我可以相应地改变我的数据模型的结构。

谢谢!

2 个答案:

答案 0 :(得分:3)

不是我甚至在iOS上都遇到过。性能的最大限制因素是NSPersistentStoreCoordinator中的缓存大小,在Mac OSX上相当大。

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

但是,我会问你为什么要这样做。当然,有些属性不会比其他属性重要,可以被抽象为一对一关系另一方的子实体吗?

答案 1 :(得分:3)

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)或者更糟,所以你想避免成为一个不常见的边缘情况。