【问题标题】:Core Data fetching is slow核心数据获取速度很慢
【发布时间】:2014-08-11 22:40:31
【问题描述】:

我正在从一个大型数据库中检索一系列对象。每次查找有 1-20 个结果。使用如下获取请求:

NSPredicate *indexPredicate = [NSPredicate predicateWithFormat:
                          @"index == %@",indexNumber];

我可以在相对较短的时间内得到结果。

CoreData: annotation: total fetch execution time: 0.0623s for 9 rows.

但是,当将所有谓词与 [NSCompoundPredicate orPredicateWithSubpredicates: 合并以在一次操作中进行提取时,速度会下降。

CoreData: annotation: total fetch execution time: 0.3890s for 195 rows.

我已经尝试过索引、设置抓取和批处理限制,但无法减少总抓取时间。我也尝试过使用 GDC 一个一个地同时执行 fetch 请求,但是在设置它时遇到了麻烦。如何减少获取这些数据的时间?

【问题讨论】:

  • 也许尝试另一个数据库?众所周知,Core Data 存在性能瓶颈。您可以使用 SQLite... 或尝试更快的 Realm - 我一直想测试一下。
  • 如上所述,这个问题没有提供足够的信息来获得有用的反馈。你的“慢”获取请求究竟是什么样的?正在搜索的数据的格式是什么?什么是数据库架构?哪些字段有索引?您很可能只是对所有元素执行线性搜索,可能会应用一个缓慢而复杂的谓词。
  • 这个复合谓词只是像indexPredicate这样的1-20个谓词的“或”,但索引号不同吗?

标签: ios core-data nsfetchrequest


【解决方案1】:

将 20 个索引查找与 OR 结合起来是获取中的大量比较。您可以通过将索引值收集到一个数组中,然后使用与IN 的单个比较来改进问题。类似的东西

NSArray *indexesToFetch = // A bunch of NSNumbers with index numbers of interest
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"indexNumber in %@", indexesToFetch];

如果您有大量数据要搜索,这仍然是很多工作。但是使用IN 来处理这样的事情通常比使用一大堆ORs 快得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    相关资源
    最近更新 更多