iOS NSArray, NSSet 与 Core Data Query (Fetch Request)
Posted
技术标签:
【中文标题】iOS NSArray, NSSet 与 Core Data Query (Fetch Request)【英文标题】:iOS NSArray, NSSet versus Core Data Query (Fetch Request) 【发布时间】:2013-09-19 17:26:09 【问题描述】:我的老板和我正在尝试找出处理核心数据中数据的最佳方式,我们正在尝试找出两种不同处理方式的优缺点。我们正在研究不同方法的效率。
1) 我们将数据模型中的每个表存储到一个 NSArray 或 NSSet 中,并且仅在一行被修改或添加了一行时才发出获取请求。然后我们通过使用谓词过滤它们来操作 NSArray 和 NSSets 到我们需要的东西。
2) 我们一开始就设置了获取请求,只用复合谓词抓取我们需要的数据,然后从那里开始。
我们测试了两者之间的时间。选项 1) 0.000259 秒 选项 2) 0.000528 秒
我们也在考虑一些事情。选项 1 似乎更快,但仅仅是因为我们只处理了大约几百行数据,并且如果数组变得很大,比如我们开始达到一百万行,我们会遇到内存问题。
我们认为选项 2 应该是更快的选项,但还是因为没有足够的数据而变得更慢?如果有一百万行,它会遇到内存问题吗?
如果您能解释为什么一个会比另一个更有效率,那将不胜感激。
【问题讨论】:
【参考方案1】:您不想将一百万个对象拉入内存然后在那里过滤它们。这是非常低效的。数据库已经过优化,非常适合过滤大型数据集。您应该让 SQLite 完成繁重的工作,而不是将所有对象推入整个 Core Data 堆栈。
如果可能,您通常应该通过关系来获取您的数据。
如果您需要使用获取请求(例如,因为您想要查询所有数据或想要搜索特定对象),那么您应该使您的谓词尽可能窄,并且只将对象拉入您真正的上下文中需要。
为了快速发出 fetch 请求,您应该将谓词从便宜到昂贵(请参阅 Apple 的 Predicate Programming Guide)并在实体上使用适当的索引。我们在objc.io issue #4,特别是Fetch Requests 中写了一些关于此的内容。
【讨论】:
【参考方案2】:我对大型(r)数据集和NSArray's
有一些经验。到目前为止,我在数组中使用的最大数据集大约是 8200 行。我发现这种尺寸的东西性能很好。 1/2 百万的数组很可能会造成内存问题。
#2 较慢的原因是命中托管对象和Core Data
堆栈比简单地处理数组开销更大。
我的建议是构建一个测试应用程序,您可以使用它来填充一个大型数组,并查看您获得了什么样的性能以及内存问题可能是什么。为此使用 Instruments 将帮助您更好地了解在极端情况下哪种情况可能是最好的。
【讨论】:
在#1中,如果实体有大量的属性怎么办?并且某些属性可能包含大量数据?以上是关于iOS NSArray, NSSet 与 Core Data Query (Fetch Request)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 NSManagedObjects 的集合(NSArray 或 NSSet)上设置 KVO