2010-05-29 40 views
1

我正在使用核心數據來存儲很多(1000s)的項目。每個項目上的一對屬性用於確定唯一性,所以當新項目進入時,我會在插入它之前將其與現有項目進行比較。由於傳入的數據是RSS饋送的形式,因此通常會有很多副本,並且分離步驟的成本爲O(N^2),這已變得非常重要。使用現有的核心數據實體進行抽樣

現在,我在迭代(可能的)新項目列表之前創建一組現有項目。我的理論是,在第一次迭代中,所有項目都會出錯,並且假設我們沒有按下內存,那麼大部分這些項目將在迭代過程中保持駐留。

我看到我的選擇正是如此:爲uniquing

  1. 使用字符串比較,遍歷所有的「新」項目和比較所有現有項目(目前的做法)
  2. 使用謂詞來篩選組現有項目違反「新」項目的屬性。
  3. 對核心數據使用謂詞來確定每個「新」項目的唯一性(不檢索現有項目集合)。

選項3是否可能比我目前的方法更快?你知道更好的方法嗎?

回答

2

整數哈希值的比較 - 生成傳入RSS新聞項目組件的哈希值,使用謂詞過濾具有相同哈希屬性值的所有項目,並查看是否有任何對象被提取 - 可以產生更好的性能比每個實體內所有屬性的字符串比較。

+0

我結束了這條路線,目前看起來非常高效。謝謝您的幫助。 – warrenm 2010-06-28 17:55:29

0

按Alex的答案,在整數屬性謂語應該更快,但策略應進行調整以更好地適應任務:

  1. 收集所有傳入項的哈希列表

  2. 取匹配散列表中的所有對象(僅取hash屬性)

  3. 遍歷傳入的項目,跳過那些有自己的散列在所獲取的匹配

此外,您可以取一個字典結果,以避免建立您將不使用(除非你打算更新現有的對象,而不是僅僅跳過相同傳入項目)的管理對象

1

第三ohhorob提出的解決方案的步驟可能是最有效的實施,如在'Implementing Find-or-Create Efficiently'部分的核心數據文檔中所述。也就是說,在散列屬性之後對傳入項目及其相應的現有項目進行排序,然後並行地循環兩個集合。

+0

這是一個出色的文檔。我不知道我以前沒見過。 – warrenm 2010-06-06 05:17:08