iOS NSArray,NSSet与核心数据查询(获取请求)

时间:2013-09-19 17:26:09

标签: ios core-data nsarray nsset

我的老板和我正在试图弄清楚从核心数据处理数据的最佳方法是什么,我们正试图找出处理它的两种不同方式的优缺点。我们正在研究不同方法的效率。

1)我们将数据模型中的每个表存储到NSArray或NSSet中,并且只在修改了行或添加了行时才生成获取请求。然后我们通过使用谓词过滤它们来操纵NSArray和NSSets到我们需要的东西。

2)我们在开始时设置了获取请求,只获取复合谓词所需的数据,然后从那里开始。

我们测试了两者之间的时间。选项1)0.000259秒                                       选项2)0.000528秒

我们还有一些我们正在考虑的事情。选项1似乎更快但是只是因为我们只处理大约几百行数据并且如果阵列变得很大,我们会遇到内存问题我们开始达到一百万行。

我们认为选项2应该是更快的选项,但是因为没有足够的数据,它再次变慢了吗?如果有一百万行,它会遇到内存问题吗?

如果你能解释为什么一个人会比另一个人更有效率,那将会非常感激。

2 个答案:

答案 0 :(得分:2)

你不想将一百万个对象拉入内存然后在那里过滤它们。这是非常低效的。数据库已经过优化,非常适合过滤大型数据集。您应该让SQLite完成繁重的工作,而不是将所有对象都推送到整个Core Data堆栈。

如果可能,您通常应该通过关系来获取数据。

如果您需要使用获取请求(例如,因为您想要查询所有数据或者您想要搜索特定对象),那么您应该使您的谓词尽可能地缩小,并且只将对象拉入您真正的上下文中需要。

为了快速获取获取请求,您应该将谓词从便宜到昂贵(请参阅Apple的Predicate Programming Guide)并在实体上使用适当的索引。我们在objc.io issue #4中写了一些相关内容,特别是Fetch Requests

答案 1 :(得分:1)

我对大型(r)数据集和NSArray's有一些经验。到目前为止,我在一个数组中使用的最大数据集大约是8200行。我找到了很棒的性能。一个半数的数组可能会造成内存问题。

#2较慢的原因是命中托管对象和Core Data堆栈比简单处理数组更有开销。

我的建议是构建一个测试应用程序,您可以使用它来填充大型数组,看看您获得了哪种性能以及内存问题可能是什么。使用Instruments可以帮助您更好地了解哪种情况在极端情况下可能是最佳的。