与现有核心数据实体不同

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 的回答,整数属性的谓词应该更快,但应该调整策略以更好地适应任务:

    收集所有传入项目哈希的列表

    获取与该哈希列表匹配的所有对象(仅获取哈希属性)

    遍历传入的项目,跳过那些在获取的匹配项中具有哈希值的项目

此外,您可以获取字典结果以避免设置您不会使用的托管对象(除非您打算更新现有对象而不是仅仅跳过相同的传入项目)

【讨论】:

以上是关于与现有核心数据实体不同的主要内容,如果未能解决你的问题,请参考以下文章

新的核心数据实体与现有实体相同:单独的实体或其他解决方案?

核心数据 - 编辑、递增和保存属性到现有实体

如何创建从一个实体到另一个现有实体的核心数据关系?

如何替换核心数据实体的现有记录

涉及新实体和一对多关系的核心数据迁移

在新版本中添加现有实体的新属性时核心数据崩溃