Хранение и обработка больших объемов данных в рекомендательном движке сайта Imhonet.ru Дмитрий Исайкин
Функции сервиса Анализирует индивидуальный вкус и предпочтения пользователя Подбирает пользователей со схожими вкусами и интересами Предоставляет персональные рекомендации по объектам Удобная  альтернатива  классическим поисковикам
Функциональные компоненты рекомендательного сервиса Рекоменда - тельный движок Сайт Imhonet Коннектор Сайты-партнеры Пользователи
Что нужно для расчета рекомендаций Чем больше оценок, тем точнее рекомендации
Расчет рекомендаций Построение референтной группы поиск оценок на объекты, оцененные клиентом — поиск кандидатов поиск оценок кандидатов и сравнение их с оценками клиента !!! ??? Запрос Другие пользователи Построение рекомендаций поиск оценок референтов Референты
Алгоритм в разрезе доступа к данным Ср. кол-во оценок у объекта = 1000 Ср. кол-во оценок у субъекта = 100 Количество обращений к оценкам: 100  запросов к объектам 6 000  запросов к субъектам + сравнение их оценок
Где хранить оценки?
Зачем делать самому? + Только нужный функционал + Минимум побочных расходов + Оптимизация под задачу + Быстрота исправления ошибок + Простота API контейнера + Никакого администрирования –   Затраты на разработку и поддержку –   Проблемы масштабирования Не очень много: менее  900  строк кода на всё Запас на  год-два . Проблема уже решается
Проектирование контейнера Ассоциативный массив Матрица Требуются только выборки оценок по конкретному пользователю/объекту Матричное представление более предпочтительно
Проектирование контейнера. Анализ структуры оценок Будем хранить оценки в разреженной матрице
Проектирование контейнера. Разреженная матрица
Проектирование контейнера. Анализ паттернов доступа Требуется максимальная скорость просмотра оценок пользователя Будем хранить оценки в массиве пар (произведение, оценка)‏ объ ект оценка оценка пользователь объ ект
Проектирование контейнера. Анализ паттернов доступа Требуется быстрое сравнение оценок двух пользователей Будем хранить оценки упорядоченными по идентификаторам 5 оценка 8 оценка пользователь
Проектирование контейнера Требуется быстрый поиск оценок пользователей/произведений + не все пользователи/произведения имеют оценки Будем хранить ссылки на пользовательские оценки в хэш-таблице
Что мы получили hash_map< subj, array<  pair<obj, rate>  > > –  Не является потокобезопасным
Способы обеспечения безопасной многопоточности Взаимоисключающая блокировка Блокировка на чтение-запись Copy and Swap
Изменение данных без блокировки читателей Блокируем на запись Создаем копию оценок пользователя Вносим изменения в копию Подменяем старые оценки на новые Используем механизм подсчета ссылок для автоматического удаления неиспользуемой старой копии оценок
Изменения в структуре для обеспечения CAS hash_map<  subj,  ref_count_ptr < array< pair<obj, rate>  > > >
Сравнение с MySQL Конфигурация MySQL: таблица  MyISAM , файл базы в памяти,  индекс  и по  субъектам , и по  объектам Входные данные: лог запросов к оценкам при реальном расчете рекомендаций в движке. Один поток исполнения. Только чтение
Результаты: операций в секунду Оценок: 10.5 миллионов Запросов к данным: 4.2 миллиона Рассчитанных рекомендаций: 700 636 000 9500 Контейнер операций чтения Движок вычислений MySQL 504  оп. чтения
Спасибо за внимание! Вопросы? Дмитрий Исайкин [email_address]

хранение и обработка больших объемов данных в рекомендательном движке сайта Imhonet

  • 1.
    Хранение и обработкабольших объемов данных в рекомендательном движке сайта Imhonet.ru Дмитрий Исайкин
  • 2.
    Функции сервиса Анализируетиндивидуальный вкус и предпочтения пользователя Подбирает пользователей со схожими вкусами и интересами Предоставляет персональные рекомендации по объектам Удобная альтернатива классическим поисковикам
  • 3.
    Функциональные компоненты рекомендательногосервиса Рекоменда - тельный движок Сайт Imhonet Коннектор Сайты-партнеры Пользователи
  • 4.
    Что нужно длярасчета рекомендаций Чем больше оценок, тем точнее рекомендации
  • 5.
    Расчет рекомендаций Построениереферентной группы поиск оценок на объекты, оцененные клиентом — поиск кандидатов поиск оценок кандидатов и сравнение их с оценками клиента !!! ??? Запрос Другие пользователи Построение рекомендаций поиск оценок референтов Референты
  • 6.
    Алгоритм в разрезедоступа к данным Ср. кол-во оценок у объекта = 1000 Ср. кол-во оценок у субъекта = 100 Количество обращений к оценкам: 100 запросов к объектам 6 000 запросов к субъектам + сравнение их оценок
  • 7.
  • 8.
    Зачем делать самому?+ Только нужный функционал + Минимум побочных расходов + Оптимизация под задачу + Быстрота исправления ошибок + Простота API контейнера + Никакого администрирования – Затраты на разработку и поддержку – Проблемы масштабирования Не очень много: менее 900 строк кода на всё Запас на год-два . Проблема уже решается
  • 9.
    Проектирование контейнера Ассоциативныймассив Матрица Требуются только выборки оценок по конкретному пользователю/объекту Матричное представление более предпочтительно
  • 10.
    Проектирование контейнера. Анализструктуры оценок Будем хранить оценки в разреженной матрице
  • 11.
  • 12.
    Проектирование контейнера. Анализпаттернов доступа Требуется максимальная скорость просмотра оценок пользователя Будем хранить оценки в массиве пар (произведение, оценка)‏ объ ект оценка оценка пользователь объ ект
  • 13.
    Проектирование контейнера. Анализпаттернов доступа Требуется быстрое сравнение оценок двух пользователей Будем хранить оценки упорядоченными по идентификаторам 5 оценка 8 оценка пользователь
  • 14.
    Проектирование контейнера Требуетсябыстрый поиск оценок пользователей/произведений + не все пользователи/произведения имеют оценки Будем хранить ссылки на пользовательские оценки в хэш-таблице
  • 15.
    Что мы получилиhash_map< subj, array< pair<obj, rate> > > – Не является потокобезопасным
  • 16.
    Способы обеспечения безопасноймногопоточности Взаимоисключающая блокировка Блокировка на чтение-запись Copy and Swap
  • 17.
    Изменение данных безблокировки читателей Блокируем на запись Создаем копию оценок пользователя Вносим изменения в копию Подменяем старые оценки на новые Используем механизм подсчета ссылок для автоматического удаления неиспользуемой старой копии оценок
  • 18.
    Изменения в структуредля обеспечения CAS hash_map< subj, ref_count_ptr < array< pair<obj, rate> > > >
  • 19.
    Сравнение с MySQLКонфигурация MySQL: таблица MyISAM , файл базы в памяти, индекс и по субъектам , и по объектам Входные данные: лог запросов к оценкам при реальном расчете рекомендаций в движке. Один поток исполнения. Только чтение
  • 20.
    Результаты: операций всекунду Оценок: 10.5 миллионов Запросов к данным: 4.2 миллиона Рассчитанных рекомендаций: 700 636 000 9500 Контейнер операций чтения Движок вычислений MySQL 504 оп. чтения
  • 21.
    Спасибо за внимание!Вопросы? Дмитрий Исайкин [email_address]

Editor's Notes

  • #2 представиться