1

我正在使用 Core Data 来存储很多(1000 多个)项目。每个项目的一对属性用于确定唯一性,因此当有新项目进入时,我会在插入之前将其与现有项目进行比较。由于传入的数据是 RSS 提要的形式,经常有很多重复,并且唯一化步骤的成本是 O(N^2),这变得很重要。

现在,我在迭代(可能的)新项目列表之前创建了一组现有项目。我的理论是,在第一次迭代中,所有项目都会出错,并且假设我们没有被内存占用,大多数这些项目将在迭代过程中保持驻留。

因此,我看到了我的选择:

  1. 使用字符串比较进行唯一性,迭代所有“新”项目并与所有现有项目进行比较(当前方法)
  2. 使用谓词根据“新”项目的属性过滤现有项目集。
  3. 使用带有 Core Data 的谓词来确定每个“新”项目的唯一性(而不检索现有项目的集合)。

选项 3 可能比我目前的方法更快吗?你知道更好的方法吗?

4

3 回答 3

2

整数哈希值的比较——生成传入 RSS 新闻项的组件的哈希,使用谓词过滤具有相同哈希属性值的所有项目,并查看是否获取了任何对象——可能比字符串比较产生更好的性能每个实体中的所有属性。

于 2010-05-30T03:40:37.343 回答
1

ohhorob 提出的解决方案的第三步可能最有效地实现,如“高效实现查找或创建”部分的核心数据文档中所述。也就是说,在 hash 属性之后对传入的项目及其对应的现有项目进行排序,然后并行循环这两个集合。

于 2010-06-03T20:19:28.450 回答
0

根据亚历克斯的回答,整数属性的谓词应该更快,但应该调整策略以更好地适应任务:

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

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

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

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

于 2010-05-30T05:12:32.910 回答