Уникальность с существующими базовыми объектами данных

Я использую Core Data для хранения большого количества (1000) элементов. Пара свойств каждого элемента используется для определения уникальности, поэтому, когда появляется новый элемент, я сравниваю его с существующими элементами перед вставкой. Поскольку входящие данные представлены в виде RSS-канала, дубликатов часто много, а стоимость этапа уникальности составляет O(N^2), что стало значительным.

Прямо сейчас я создаю набор существующих элементов, прежде чем перебирать список (возможных) новых элементов. Моя теория состоит в том, что на первой итерации все элементы будут ошибочными, и если предположить, что мы не нуждаемся в памяти, большинство этих элементов останутся резидентными в течение итерации.

Я вижу свои варианты таким образом:

  1. Используйте сравнение строк для уникальности, повторения всех «новых» элементов и сравнения со всеми существующими элементами (текущий подход).
  2. Используйте предикат для фильтрации набора существующих элементов по свойствам «новых» элементов.
  3. Используйте предикат с базовыми данными, чтобы определить уникальность каждого «нового» элемента (без извлечения набора существующих элементов).

Будет ли вариант 3 быстрее, чем мой текущий подход? Вы знаете лучший способ?


person warrenm    schedule 29.05.2010    source источник


Ответы (3)


Сравнение целочисленных хеш-значений — создание хэш-компонентов входящих новостей RSS, использование предиката для фильтрации всех элементов с одинаковым значением хеш-атрибута и проверка того, был ли извлечен какой-либо объект — может дать более высокую производительность, чем сравнение строк все атрибуты внутри каждой сущности.

person Alex Reynolds    schedule 30.05.2010
comment
Я пошел по этому пути, и пока он кажется довольно эффективным. Спасибо за помощь. - person warrenm; 28.06.2010

Третий шаг предложенного ohhorob решения, вероятно, реализован наиболее эффективно, как описано в документации Core Data в разделе 'Эффективная реализация функции "Найти или создать". То есть сортировка как входящих элементов, так и соответствующих им существующих элементов после свойства hash, а затем параллельный цикл по двум коллекциям.

person cahlbin    schedule 03.06.2010
comment
Это выдающийся документ. Я не знаю, как я не видел его раньше. - person warrenm; 06.06.2010

Согласно ответу Алекса, предикат для целочисленного свойства должен быть быстрее, но стратегия должна быть скорректирована, чтобы лучше соответствовать задаче:

  1. собрать список всех входящих хэшей элементов

  2. извлекать все объекты, соответствующие этому списку хэшей (извлекать только свойство хэша)

  3. перебирать входящие элементы, пропуская те, у которых есть хэш в выбранных совпадениях

Кроме того, вы можете получить результат словаря, чтобы избежать настройки управляемых объектов, которые вы не будете использовать (если только вы не собираетесь обновлять существующие объекты, а не просто пропускать идентичные входящие элементы).

person ohhorob    schedule 30.05.2010