与现有核心数据实体不同
Posted
技术标签:
【中文标题】与现有核心数据实体不同【英文标题】:Uniquing with Existing Core Data Entities 【发布时间】:2010-05-29 22:16:30 【问题描述】:我正在使用 Core Data 存储大量(1000 多个)项目。每个项目的一对属性用于确定唯一性,因此当有新项目进入时,我会在插入之前将其与现有项目进行比较。由于传入的数据是RSS提要的形式,经常有很多重复,唯一化步骤的成本是O(N^2),已经变得很重要了。
现在,我在迭代(可能的)新项目列表之前创建了一组现有项目。我的理论是,在第一次迭代中,所有项目都会出错,假设我们没有被内存占用,大部分项目将在迭代过程中保持驻留。
我因此看到了我的选择:
-
使用字符串比较进行唯一化、迭代所有“新”项目并与所有现有项目进行比较(当前方法)
使用谓词根据“新”项目的属性过滤现有项目集。
在 Core Data 中使用谓词来确定每个“新”项目的唯一性(无需检索现有项目集)。
选项 3 是否可能比我目前的方法更快?你知道更好的方法吗?
【问题讨论】:
【参考方案1】:整数哈希值的比较——生成传入 RSS 新闻项目的组件的哈希,使用谓词过滤具有相同哈希属性值的所有项目,并查看是否获取了任何对象——可能会产生比每个实体中所有属性的字符串比较。
【讨论】:
我最终选择了这条路线,到目前为止它似乎表现不错。感谢您的帮助。【参考方案2】:ohhorob 提出的解决方案的第三步可能按照'Implementing Find-or-Create Efficiently' 部分的核心数据文档中的描述最有效地实现了。也就是说,在 hash 属性之后对传入项及其对应的现有项进行排序,然后并行循环这两个集合。
【讨论】:
那是一份出色的文件。我不知道我以前怎么没见过。【参考方案3】:根据 Alex 的回答,整数属性的谓词应该更快,但应该调整策略以更好地适应任务:
收集所有传入项目哈希的列表
获取与该哈希列表匹配的所有对象(仅获取哈希属性)
遍历传入的项目,跳过那些在获取的匹配项中具有哈希值的项目
此外,您可以获取字典结果以避免设置您不会使用的托管对象(除非您打算更新现有对象而不是仅仅跳过相同的传入项目)
【讨论】:
以上是关于与现有核心数据实体不同的主要内容,如果未能解决你的问题,请参考以下文章