хранение и обработка больших объемов данных в...

Preview:

DESCRIPTION

 

Citation preview

Хранение и обработка больших объемов данных в

рекомендательном движке сайта 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 оп.чтения

Спасибо за внимание!

Вопросы?

Дмитрий Исайкинdisaykin@imhonet.ru

Recommended