我正在使用Core Data来存储很多(1000s)项目。每个项目上的一对属性用于确定唯一性,因此当新项目进入时,我会在插入之前将其与现有项目进行比较。由于传入的数据是RSS提要的形式,因此通常会有许多重复数据,而且单一步骤的成本是O(N ^ 2),这已经变得非常重要。
现在,我在迭代(可能的)新项目列表之前创建了一组现有项目。我的理论是,在第一次迭代中,所有项目都会出现故障,并假设我们没有按内存,大多数项目将在迭代过程中保持驻留。
我看到了我的选择:
选项3可能比我目前的方法更快吗?你知道更好的方法吗?
答案 0 :(得分:2)
整数散列值的比较 - 生成传入RSS新闻项的组件的散列,使用谓词过滤具有相同散列属性值的所有项,并查看是否获取了任何对象 - 可能产生比每个实体中所有属性的字符串比较。
答案 1 :(得分:1)
ohhorob提出的解决方案的第三步可能是最有效的实现,如'Implementing Find-or-Create Efficiently'部分的核心数据文档中所述。也就是说,在散列属性之后对传入的项及其对应的现有项进行排序,然后在并行循环两个集合。
答案 2 :(得分:0)
根据Alex的回答,整数属性的谓词应该更快,但应该调整策略以更好地适应任务:
收集所有传入项目哈希的列表
获取与该哈希列表匹配的所有对象(仅获取哈希属性)
迭代传入的项目,跳过在获取的匹配项中具有哈希值的项目
此外,您可以获取字典结果,以避免设置您不会使用的托管对象(除非您打算更新现有对象而不是仅跳过相同的传入项目)