Хранение и обработка больших объемов данных в рекомендательном движке сайта Imhonet.ru Дмитрий Исайкин
Хранение и обработка больших объемов данных в
рекомендательном движке сайта Imhonet.ru
Дмитрий Исайкин
Функции сервиса• Анализирует индивидуальный вкус и
предпочтения пользователя• Подбирает пользователей со схожими вкусами и
интересами• Предоставляет персональные рекомендации по
объектам
Удобная альтернатива классическим поисковикам
Функциональные компоненты рекомендательного сервиса
Рекоменда-тельныйдвижок
Сайт Imhonet
Коннектор
Сайты-партнеры
Пользователи
Что нужно для расчета рекомендаций
Чем больше оценок, тем точнее рекомендации
Расчет рекомендацийПостроение референтной группыпоиск оценок на объекты, оцененные клиентом — поиск кандидатовпоиск оценок кандидатов и сравнение их с оценками клиента
!!!???
Запрос
Другиепользователи
Построение рекомендацийпоиск оценок референтовРеференты
Алгоритм в разрезе доступа к данным
Ср. кол-во оценок у объекта = 1000
Ср. кол-во оценок у субъекта = 100
Количество обращений к оценкам:
100 запросов к объектам
6 000 запросов к субъектам + сравнение их оценок
SQL Файл ОЗУНадежность решения + – +/–
Быстрота доступа к данным – – +
Использование оперативной памяти мало мало много
Компактность хранения данных +/– + +
Возможности оптимизации под задачу +
+/– –
Накладные расходы много много очень мало
–/+ –/+
Масштабируемость –/+
Где хранить оценки?
Зачем делать самому?+ Только нужный функционал+ Минимум побочных расходов+ Оптимизация под задачу+ Быстрота исправления ошибок+ Простота API контейнера+ Никакого администрирования– Затраты на разработку и поддержку– Проблемы масштабирования
Не очень много:менее 900 строккода на всё
Запас на год-два.Проблема ужерешается
Проектирование контейнера• Ассоциативный массив• Матрица
Требуются только выборки оценок по конкретному пользователю/объекту
Матричное представление более предпочтительно
Проектирование контейнера.Анализ структуры оценок
Пользователи
1 2 3 4 5 6 7
Объекты
1 +5 +2 +52 -5
3 -2
4 +1 +4 +3
5 +2
6 -1
7 +3 +3
Будем хранить оценки в разреженной матрице
Пользователи
1 2 3 4 5 6 7Объекты
1 +5 +2 +52 -5
3 -2
4 +1 +4 +3
5 +2
6 -1
7 +3 +3
Проектирование контейнера.Разреженная матрица
Проектирование контейнера.Анализ паттернов доступа
Требуется максимальная скорость просмотра оценок пользователя
Будем хранить оценки в массиве пар (произведение, оценка)
объект оценка оценкапользователь
объект
Проектирование контейнера.Анализ паттернов доступа
Требуется быстрое сравнение оценок двух пользователей
Будем хранить оценки упорядоченными по идентификаторам
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
Контейнер
операций чтенияДвижок
вычислений
MySQL504 оп.чтения