大型数据集上的核心数据获取请求缓慢

Posted

技术标签:

【中文标题】大型数据集上的核心数据获取请求缓慢【英文标题】:Core Data Fetch requests slow on large data set 【发布时间】:2013-12-09 02:14:50 【问题描述】:

这是我的第一个 Core Data 项目,我需要有关加快获取请求的建议。

我的核心数据模型包含 2 个实体,WellsFluidsWells 有 50,000 条记录,Fluids 有 200 万条记录。它们如下所示。

Wells
nams  
relation  
wellsToFluids

Fluids
text1, text2, etc.  
relation  
fluidsToWells  

Wells 上的获取请求非常快。 Wells 上的获取请求以及来自 Fluids 的数据通过 wellsToFluids 关系通过复合谓词访问的数据很慢。而且,我在不同的谓词上看到了意外的获取时间。

我正在根据用户选择构建复合谓词。但基本上情况如下

搜索Wells:

predicateWithFormat: @"(wellNumber == 1)"

.001 秒

流体搜索:

predicateWithFormat: @"(ANY  wellsToFluids.text2 CONTAINS[c] stringToFind)"

1.3 秒。 (在 Mac 模拟器上——在 iPhone 或 iPad 上真的很慢)

获取WellsFluids

predicateWithFormat: @"(wellNumber == 1)  AND (ANY  wellsToFluids.text1 CONTAINS[c] stringToFind)"

3.2 秒。

获取Wells 和多个Fluids 属性:

predicateWithFormat: @"(wellNumber == 1)  AND (ANY  wellsToFluids.text1 CONTAINS[c] stringToFind) AND (ANY  wellsToFluids.text2 CONTAINS[c] stringToFind)"

6 秒。

将谓词的Fluids 部分更改为子查询会产生奇怪的结果。

仅使用子查询获取 Fluids

predicateWithFormat:@"(SUBQUERY(wellsToFluids, $x, ANY $x.text1 CONTAINS[c] stringToFind).@count !=0)"

12 秒。

使用子查询获取WellsFluids

predicateWithFormat: @"(wellNumber == 1)  AND  (SUBQUERY(wellsToFluids, $x, ANY $x.text1 CONTAINS[c] stringToFind).@count !=0)"

3.2 秒。

Fluids fetch 添加的其他属性的时间不会改变,保持在相当恒定的 3.2 秒。

还尝试从Fluids 获取,然后使用与Wells 的关系——但这并没有提高速度。

有人可以给我一些关于改进提取设置的建议吗?或者它只是 200 万条记录的一个功能?

【问题讨论】:

文本匹配谓词(例如 CONTAINS)通常比简单的“数字 == 1”慢得多,特别是如果您使用 [c] 进行搜索(不区分大小写)。我将首先检查“ANY wellsToFluids.text1 CONTAINS stringToFind”或“ANY wellsToFluids.text1 == stringToFind”是否会影响速度。 谢谢 - 实际上确实尝试过。像你一样,认为它会产生很大的不同,但它并没有产生显着的差异。 这是一个好问题,但下次请以正确的方式格式化它。 【参考方案1】:

这里有一些提示可以实现您想要的。无论如何,您总是需要衡量您的更改以查看它们是否有效。这是一个反馈过程。改变和衡量。变化和测量等等。

预取关系 使用批次 首选beginwithendswith 而不是contains 必要时避免 [cd] 规范化字符串 ...

这些只是提示。

我真的建议看看High Performance Core Data 博客。有关于如何实现这一点的视频、幻灯片和代码。 马修·莫雷做得非常好。

Apple 开发者网站(您必须是会员才能观看)在 WWDC 2013 视频 中有一个名为 Core Data Performance Optimization and Debugging (session 211) 的会话> 谈论性能。

【讨论】:

感谢您的反馈。抱歉格式化 - 新网站。下次会做的更好!!你推荐的博客很棒。

以上是关于大型数据集上的核心数据获取请求缓慢的主要内容,如果未能解决你的问题,请参考以下文章

大型数据集上的 R 中的 hclust()

大型数据集上的 R 中的矩阵数学

基于条件的 2 个大型数据集上的模糊模糊字符串匹配 - python

python计算多个模型在不同数据集上的预测概率获取每个数据集上的最优模型多个最优模型的ROC曲线进行对比分析

如何在大型数据集上执行克里金(高斯过程回归)?

lfw 数据集上的 vgg16 不获取 RGB