Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 24, 2013 22:49:27

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Запрос на получение объектов своих друзей с сортировкой

Есть список друзей которые на-Like-али себе книг.
Теперь нужно получить список этих книг с сортировкой: сверху те книги где больше лайков от друзей.
Т.е. книга 1) всего лайков 1000, из них лайков друзей: 15 - будет ниже чем 2) всего лайков 200, из них лайков друзей: 25

Как это лучше хранить (и в чем) и как получить результат?

Максимум Лайков на один объект будет < 1000 (1 версия), < 1М (2 версия).

Сейчас в голове только один нормальный вариант выборки - загонять идентификаторы пользователей кто налайкал в sphinx (в разрезе объектов), и делать выборку по релевантности.

Офлайн

#2 Дек. 24, 2013 23:13:08

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Запрос на получение объектов своих друзей с сортировкой

Получить список друзей, получить список книг к которым есть лайки и посчитать на python очень не эффективно ?

Офлайн

#3 Дек. 25, 2013 07:59:23

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Запрос на получение объектов своих друзей с сортировкой

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

По идее это динамическое поле, т.е. получается, все равно все перебирать.
Ещё это можно сделать на mongodb aggregation framework (с версии 2.5.3), но на sphinx будет быстрее.

Нашел как чуть ускорить текущее решение, пока оставлю этот способ, когда прижмет - перепилю.

Офлайн

#4 Дек. 25, 2013 14:53:47

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Запрос на получение объектов своих друзей с сортировкой

o7412369815963
ну это был не ответ выше.

Можно завести таблицу со значениями лайков для каждого пользователя. Например

{id:45 , books:
{
#bookid:value
'55': 5,
'78': 6,
 }
 }
И когда происходит лайк выбирать друзей пользователя который лайкнул и в этой таблице к каждему пользователю к этой книге прибалять один (ну или создавать если нет). Если даже это действие очень дорогое можно положить это в очередь celery.

Таблица не верно - надо брать mongo или sorted sets redis, хотя наверно и в РСУБД такое можно хранить.

Вроде sorted sets вес может быть не больше 100(или нет), так-что хеши лучше. Даже команда есть для таких целей http://redis.io/commands/HINCRBY

Отредактировано Singularity (Дек. 25, 2013 15:23:31)

Офлайн

#5 Дек. 25, 2013 18:23:08

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Запрос на получение объектов своих друзей с сортировкой

Про такой вариант тоже думал, это получается своеобразное кеширование. Больше нагрузки будет когда пользователи будут фоловить других.
Если на пальцах посчитать: 100к пользователей, каждый фоловит по 200, каждый сделал по 500 лайков (-20% пересечений) х 2 байта = 15Гб индекс.
Думаю выгоднее будет вычислять без кеширования (т.е. купить cpu вместо памяти), (100к * 500 х 4байта (ссылка на пользователя) = 190Мб индекс)

Интересен был бы вариант с частичным кешированием, но есть ли такой?

Офлайн

#6 Дек. 25, 2013 21:35:34

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Запрос на получение объектов своих друзей с сортировкой

Какая СУБД и какая структура таблиц?

o7412369815963
каждый фоловит по 200
Обычно для расчетов берут число Данбара (и кратные ему - только для краевых условий).
Вы осознанно взяли 200?



Офлайн

#7 Дек. 26, 2013 09:30:43

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Запрос на получение объектов своих друзей с сортировкой

Lexander
Какая СУБД и какая структура таблиц?
Сейчас mongodb, в 2-х версиях, 1) отдельно коллекция событий, где есть: user_id, obj_id, when, и 2) в самом объекте массив ссылок на пользователей кто лайкнул.
1) Позволяет строить разные ленты “последних событий, последние лайкнутые”
2) Позволяет узнать лайкнул ли пользователь текущий объект без доп. запросов в БД

Lexander
Вы осознанно взяли 200?
Просто представил сколько могло бы быть в среднем.
Думаю число Данбара больше подходит для “друзей”, для фоловеров оно может быть больше.

Офлайн

#8 Дек. 26, 2013 13:14:41

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Запрос на получение объектов своих друзей с сортировкой

Я бы сказал что это число бесполезное в интернете

Офлайн

#9 Дек. 26, 2013 15:00:28

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Запрос на получение объектов своих друзей с сортировкой

Singularity
Я бы сказал что это число бесполезное в интернете
Бойтесь стереотипов, они серьезно мешают работе. :)
http://arxiv.org/abs/1105.5170

o7412369815963
Уточню на всякий случай, что сейчас число Данбара - это не константа, а диапазон - отражение разных сфер жизни, в том числе соцсетей.
Ваши 200 в него попадают, просто хотел понять насколько указанные 200 оправданны.

По теме пока ничего в понравившегося в голову не приходит.
Будет - отпишусь.



Офлайн

#10 Дек. 27, 2013 04:13:08

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Запрос на получение объектов своих друзей с сортировкой

А можно постановку уточнить? Учитываются только лайки прямых друзей? Или друзья моих друзей мои друзья?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version