Хранение кеша PageRank - структура данных?

TimeBomb
На сайте с 19.07.2005
Offline
93
3017

Необходимо определиться со структурой хранения данных.

Кто сможет помочь?

Если уж совсем подробно, то хранить предполагается кеш Google PageRank.

Задачка такая:

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

Хранить PR нужно для каждой страницы каждого сайта (подразумевается очень много). :)

Вопрос состоит в том, какой принцип организации данных выбрать для того чтобы максимально быстро забирать данные?

Чувствую, что хранить в БД будет хуже чем например создавать дерево прямо в файловой системе и записывать/считывать PR страницы в/из файла типа /ru/searchengines/forum/forumdisplay.php?f=60 (для любимой тут ветки "апдейты Яндекса", имеющей PR4)

(ее URL: /ru/forum/search-engines/yandex);)

Может кто-нибудь подведет под мои подозрения математическую базу, или делал подобное, в общем посоветуйте!

Слава Шевцов
На сайте с 23.07.2005
Offline
370
#1

Сколько страниц? А вообще - не важно. Вам нужен memcached.

Неизменность точки зрения неизменно порождает иллюзию понимания.
[Удален]
#2

берешь бд.

в ней

url = varchar(1000);

hash = 32.

при рассчете вставляешь url = полный юрл без изменений, а hash = md5($url);

при поиске = select * from .. where hash=md5($needurl);

ну и если больше одного, то

select * from .. where url=$_GET and ID in ($hashIDs - результаты прошлого запроса)

дальше сами

TimeBomb
На сайте с 19.07.2005
Offline
93
#3

bearman, идея абсолютно ясна, "дальше сам" - могу, чай инженер-математик. Пользовать хеши я в любом случае собирался, правда в привязке к файлам, чтобы:

1.не хранить адских имен файлов (ваше url = varchar(1000)) ;)

2.немножко обезопаситься от всякого рода инъекций и т.п. - чем делать кастрацию инъекций - проще сделать 1 раз md5 и не париться - время выполнения будет такое же

Но вот все равно, не лежит у меня душа к БД... что-то мне подсказывает что деревья - лучше будут. Может быть есть красивые решения хранения деревьев в БД?

Слава Шевцов, спасибо, буду курить. С первого взгляда - немного не то, (позволит ли хостер/нужно отдельный сервак, насколько быстро/медленно работает библиотека в рhp/perl/java/т.д.). Кроме того, это именно кеш (пользуем Ram серванта) - т.е. отдача наиболее часто требуемых данных, а я об этом собираюсь думать далее. Сейчас в приоритетах - именно структура хранения данных. Самое главное что мне понравилось в том что нашел про memcached - это то, что она сама по себе является некоей хеш-таблицей. Чувствую, надо хорошенько разобраться как она это делает. Спасибо за наводку!

[Удален]
#4
TimeBomb:
bearman, идея абсолютно ясна, "дальше сам" - могу, чай инженер-математик. Пользовать хеши я в любом случае собирался, правда в привязке к файлам, чтобы:
1.не хранить адских имен файлов (ваше url = varchar(1000)) ;)
2.немножко обезопаситься от всякого рода инъекций и т.п. - чем делать кастрацию инъекций - проще сделать 1 раз md5 и не париться - время выполнения будет такое же

Но вот все равно, не лежит у меня душа к БД... что-то мне подсказывает что деревья - лучше будут. Может быть есть красивые решения хранения деревьев в БД?

Слава Шевцов, спасибо, буду курить. С первого взгляда - немного не то, (позволит ли хостер/нужно отдельный сервак, насколько быстро/медленно работает библиотека в рhp/perl/java/т.д.). Кроме того, это именно кеш (пользуем Ram серванта) - т.е. отдача наиболее часто требуемых данных, а я об этом собираюсь думать далее. Сейчас в приоритетах - именно структура хранения данных. Самое главное что мне понравилось в том что нашел про memcached - это то, что она сама по себе является некоей хеш-таблицей. Чувствую, надо хорошенько разобраться как она это делает. Спасибо за наводку!

мемкеш не подойдет по простой причине которую не назвал слава - перезагрузка и пока всем вашим данным в нем. мемкеш - обычный хештейбл в ОПЕРАТИВНОЙ памяти сервера. ПРИЧОМ если данные не влазят, то он будет выбрасывать из памяти те, которые непопулярны.

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

бд. если расставить индексы в моем варианте правильно, то по 3-30 млн записей таблице у тебя

пр для любой ссылки будет искаться за абсолютный 0.

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

TimeBomb
На сайте с 19.07.2005
Offline
93
#5

bearman, спасибо еще раз, становится все интереснее и интереснее....

bearman:
мемкеш не подойдет по простой причине которую не назвал слава - перезагрузка и пока всем вашим данным в нем. мемкеш - обычный хештейбл в ОПЕРАТИВНОЙ памяти сервера.

Слава не назвал эту причину, но я уже разобрался ;)

В любом случае, для моей задачи скорее всего потребуется "второй эшелон", для которого memcached будет как нельзя кстати.

bearman:
тебе надо использовать вложенность папок, дабы не создавать нагрузку на файлсистему, которая может в один прекрасный момент крашнуться и пока все данные.

Вариант описанный мной, (подредактировал первый пост - добавил урл для понимания его раскладки по файловой системе) вроде бы подразумевал вложенность папок... Или мы о разных вещах вещах говорим? Или я чего-то про файлы не знаю? Вы если что - про подводные камни не молчите. ;)

bearman:

бд. если расставить индексы в моем варианте правильно, то по 3-30 млн записей таблице у тебя
пр для любой ссылки будет искаться за абсолютный 0.

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

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

Про Sphinx посмотрю. Вещи касающиеся ребилдов базы меня не волнуют - хоть каждый день делай. Но пока ощущение что Sphinx - он и правда, немного для другого.

[Удален]
#6

еще пришла идея

2 таблицы - в одной первичный ключ - md5(url);

во второй - pr,md5,url,md5_id

на извлечение запрос вида

select * from results inner join(select id from md5table where hash=md5($url)) as `a` on results.md5id = `a`.id where results.url = $url.

в чем же скорость - в том, что используется select id from md5table where hash=md5($url), которая при примари кее по колонке хеш - будет возварщать ЛЮБУЮ строку за абсюлютный 0. - получаем мд5id, который ищем в таблице которая имеет индексом колонку мд5хеш. по инт11 тоже поиск будет происходить моментально.

поверьте, попробуйте - сгенерите таблицу на 5 млн записей и попробуйте выбирать из нее таким макаром. должно работать моментально, а как второй эшалон мемкеш кненчо нормально, н если сервер - один, я бы посоветовал попробовать поюзать apc cache, ибо скорость у него побыстрее изза убранной затраты времени на "соединение по сети/linuxсокету с мемкеш"

N
На сайте с 06.05.2007
Offline
419
#7

bearman, так подзапрос тут и не нужен

Беда с md5 в том, что такие индексы слишком случайны. При последовательном сканировании сайта вы получите массу операций на запись в разные участки диска. Но про запись в условии ничего не сказано. Математику-теоретику можно игнорировать такие вещи :)

Инженер-практик (который даже не сомневается, что сканирование сайта должно быть последовательным, ведь он помнит про HTTP/1.1) разбил бы поля на Host и что-там-осталось от url, и сделал бы составной индекс по двум хешам. Можно даже по первым нескольким байтам хеша Host. В этом случае последовательное сканирование сайта вызывало бы запись индекса хоть как то локализованную.

В таблице не обязательно хранить символьное представление хешей, можно и сразу байты.

и что интересно : простой индекс по строке URL в myisam может оказаться лучше из-за того что он упакован. То есть в индексе не хранится все строка, а только разница.

Так что пробуйте все варианты.

Кнопка вызова админа ()
[Удален]
#8

netwind, кстати да, можно хеш от хоста + хешь от всего урла, такое то врядли совпадет)) и использовать эту хрень как примари кей.

zzeus
На сайте с 04.01.2008
Offline
74
#9

Деревья в БД - google://MPTT

Для вас ИМХО - host + page и индекс по обеим полям решит проблему

TimeBomb
На сайте с 19.07.2005
Offline
93
#10
bearman:
netwind, кстати да, можно хеш от хоста + хешь от всего урла, такое то врядли совпадет))
zzeus:
Для вас ИМХО - host + page и индекс по обеим полям решит проблему

На host + page разделить догадался, у меня этот разбор для других целей использовался, теперь и тут пригодится. У меня там еще и id-шки уникальные хостам в базе выданы - я прикидывал что страниц будет адски много, а вот хостов - все таки счетное количество.

TimeBomb добавил 27.05.2009 в 13:32

Кстати, а может быть кто-то видел в сети документ по устройству Google датацентров?

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий