Uniquing с существующими базовыми объектами данных - PullRequest
1 голос
/ 30 мая 2010

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 30 мая 2010

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

1 голос
/ 04 июня 2010

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

0 голосов
/ 30 мая 2010

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

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

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

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

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

...