0

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

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

2)我们一开始就设置了获取请求,只用复合谓词抓取我们需要的数据,然后从那里开始。

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

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

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

如果您能解释为什么一个会比另一个更有效率,那将不胜感激。

4

2 回答 2

2

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

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

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

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

于 2013-09-20T17:09:28.367 回答
1

我对大型(r)数据集和NSArray's. 到目前为止,我在数组中使用的最大数据集大约是 8200 行。我发现这种尺寸的东西性能很好。1/2 百万的数组很可能会造成内存问题。

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

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

于 2013-09-19T17:32:58.073 回答