Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » IkonBoard и другие форумы » Ikonboard v.2 » iB 2 на dbm

Модерирует : Antuan

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

alexei



ibhacker
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вообщем решил я переделать движок под dbm, но возник вопрос. List.cgi batva посоветовал передлать таким образом:
первый хеш. Тут храним данные по топикам, как в старом list.cgi
ключ это номер топика.

Код:
1 => "|subj|desc|member|date|и тд.|",
67 => "|subj|desc|member|date|и тд.|",
61 => "|subj|desc|member|date|и тд.|",
1234=> "|subj|desc|member|date|и тд.|",
768 => "|subj|desc|member|date|и тд.|",

Во втором храним только номера хеша для последующего вывода:

Код:
%index= (  
1 => '768',
2 => '61',
3 => '67',
4=> '1',
5 => '1234',
);  

При добавлении темы/поста напрмер в тему с номером 67 во втором хеше эта тема переходит на первое место, а все остальные при этом смещаются.

Код:
%index= (  
1 => '67',
2 => '768',
3 => '61',
4=> '67',
5 => '1234',
);

И при выводе этого списка в forums.cgi мы выводим елементы первого хеша по номерам из второго.
(c) batva
Вопрос: А что если понадобиться делать сортировку не по дате последнего поста, а например по к-ву ответов, или дате создание, или навзанию, как тогда создавать второй хеш?

Всего записей: 647 | Зарегистр. 06-07-2001 | Отправлено: 13:43 01-06-2002
alexei



ibhacker
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Ауууу, batva, ответь please

Всего записей: 647 | Зарегистр. 06-07-2001 | Отправлено: 12:33 02-06-2002
Ausw



Moderator
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
в пм.

----------
Be High.

Всего записей: 7371 | Зарегистр. 12-07-2001 | Отправлено: 18:50 02-06-2002
alexei



ibhacker
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Ausw
Меня попросили перенести обсуждение из пм в форум. Давай не оффтопить.

Всего записей: 647 | Зарегистр. 06-07-2001 | Отправлено: 22:23 02-06-2002
ivank



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
alexei
Мне кажеься надо либо добавить ещё хэшей для различных сортировок -- мебе дороже.
 
Либо просто сортировать всё по инфе первого хэша -- сортировка отличная от "самый последний ответ в тему" довольно-таки редко встречается.

----------
ivank
http://ivank.oszone.net

Всего записей: 553 | Зарегистр. 24-01-2002 | Отправлено: 08:52 04-06-2002
alexei



ibhacker
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Кх-кх, а кто может объяснить как мне ребилдить второй хеш

Код:
%index= (  
1 => '768',
2 => '61',
3 => '67',
4=> '1',
5 => '1234',
);  
при добавлении новой темы, можно с примером, если у кого время имеется.

Всего записей: 647 | Зарегистр. 06-07-2001 | Отправлено: 18:35 04-06-2002
Alexander Ipp



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
alexei
М.б., конвертить в массив и его сортировать?..
Хотя томрозно...
 
Добавлено
Кстати, ИБ3 в кач-ве примера устроит?

Всего записей: 1943 | Зарегистр. 20-08-2001 | Отправлено: 19:22 04-06-2002
alexei



ibhacker
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alexander Ipp
Какой тут масив??? Этот хеш в дбм храниться Вот мне надо сделать следующее. Мне название всех ключей надо сдвинуть на 1 вперед, а вместо первого поставить еще один ключ со своим значением. Но как их сдвигать с конца я не понял,
while (($key, $value) = each %hash) {...
сначала делает перебор, а как сделать в обратном порядке?
В третьей все слегка не так

Всего записей: 647 | Зарегистр. 06-07-2001 | Отправлено: 19:45 04-06-2002
Alexander Ipp



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
alexei
Ну да, теперь ясно.
Я не совсем вчитался в ветку.
Ну так берёшь значение каждого ключа, его повышаешь инкриментом, потом кладёшь на место, потмо первый добавляешь... Только тут два хеша нужно - старый и новый, результирующий...
А м.б. вообще номера не трогать при этом?
 
Добавлено
PS Последнюю строку счтитаь недействительной.

Всего записей: 1943 | Зарегистр. 20-08-2001 | Отправлено: 20:50 04-06-2002
batva



crazy administrator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
alexei

Цитата:
Кх-кх, а кто может объяснить как мне ребилдить второй хеш  


Цитата:
Вот мне надо сделать следующее. Мне название всех ключей надо сдвинуть на 1 вперед, а вместо первого поставить еще один ключ со своим значением. Но как их сдвигать с конца я не понял,  

 
Хммм, как все запущено.
 
ладно, первое что приходит на ум, это развернуть массив в хеш, потом увеличить четные элементы на единицу и опять собрать в хеш.
Вот так.
 

Код:
 
@temp = %hash;
for ($i=0; $i<=$#temp; $i+=2){$temp[$i]++}
%hash=@temp;
$hash{1}=номер нового топика.
 

 
Метод плох, почему?  
Потому что развернуть большой хеш-файл в массив, это скушает много памяти.
 
Вот так будет намного лучше.
 

Код:
 
$id;#тут количество топиков, как получить придумай сам.
for ($i=$id; $i>1; $i--){$hash{$i}=$hash{$i-1}}
$hash{'1'}=номер нового топика
 

 
P.S а вообще, мне та схема организации, что я дал выше уже не нравится.
 
 

Цитата:
Вопрос: А что если понадобиться делать сортировку не по дате последнего поста, а например по к-ву ответов, или дате создание, или навзанию, как тогда создавать второй хеш?

 
Никак.
Делаешь все по перебору и сортировке на основании данных первого хеша.
Смысл всей этой басни такой, чтобы сделать работу форума быстрой.
А работа форума = 90% трафика это вывод топиков, 9% создание сообщений, 1% все остальное вместе взятое, а на долю перечисленных тобой фичь, приходится наверно менее 0,0001 общего трафика.
Поэтому городить огород с расчетом на всякие фичи не советую.
Фичи юзаются очень редко, поэтому подстраивать под них структуру хранения думаю не следует и заводить третий, четвертый пятый хеши и потом ребилдить их при постинге, думаю не есть хорошо.
Вообщем думай что тебе нужно, скорость работы форума, или скорость работы фич, которые все равно никто не юзает.
 
 
 
 

Всего записей: 12593 | Зарегистр. 07-01-2001 | Отправлено: 22:21 04-06-2002
alexei



ibhacker
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
batva

Код:
$id;#тут количество топиков, как получить придумай сам.
for ($i=$id; $i>1; $i--){$hash{$i}=$hash{$i-1}}
$hash{'1'}=номер нового топика

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

Цитата:
P.S а вообще, мне та схема организации, что я дал выше уже не нравится.

А есть идеи получше? Интересно будет послушать

Цитата:
Никак.
Делаешь все по перебору и сортировке на основании данных первого хеша.
Смысл всей этой басни такой, чтобы сделать работу форума быстрой.
А работа форума = 90% трафика это вывод топиков, 9% создание сообщений, 1% все остальное вместе взятое, а на долю перечисленных тобой фичь, приходится наверно менее 0,0001 общего трафика.  
Поэтому городить огород с расчетом на всякие фичи не советую.
Фичи юзаются очень редко, поэтому подстраивать под них структуру хранения думаю не следует и заводить третий, четвертый пятый хеши и потом ребилдить их при постинге, думаю не есть хорошо.
Вообщем думай что тебе нужно, скорость работы форума, или скорость работы фич, которые все равно никто не юзает.  

Ну просто на MySQL это делается без особой нагрузки на движок, а с дбм..... Хотя есть конечно идейка, фильтровать левым скриптом, скидывать туда порядок вывода, а потом вытягивать его оттуда при выводе в forums.cgi.
 
И еще один вопрос можно?, какой exec time у рубордовского forums.cgi? Если не можешь сказать я пойму, закрытый код как никак

Всего записей: 647 | Зарегистр. 06-07-2001 | Отправлено: 10:11 05-06-2002
Alexander Ipp



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
batva
Про фичи и остальное - имхо, верно говоришь.
Про то, как всё запущено - это точно... Тот ещё из меня программёр... С флэтами и массивами ещё ничего, а всё остальное...
alexei
batva прав... Ты когда у себя на конфе в последний аз тот же фильтр юзал? Когда на локале тестил?
Так что надо делать дефолт максимально быстрым, а фичи - как придётся.

Всего записей: 1943 | Зарегистр. 20-08-2001 | Отправлено: 10:17 05-06-2002
batva



crazy administrator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
alexei

Цитата:
Я так уже делал, все равно при большом хеше память жрет  

жрет?
если уж тут у тебя жрет, тогда вообще никак не получится, сорри.
 

Цитата:
Просто я думал, что можно как-то средствами базы сдвиг сделать, не выгружая каждый елемент.  

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

Цитата:
Ну просто на MySQL это делается без особой нагрузки на движок

Хаа, уверен?
Имея таблицу постов размером в пару сотен мегов, ты будешь долго ждать свою фичу. А сделаешь кучу индексов в таблице, по всем полям, по которым твои фичи, так получишь огромный размер базы, а значит тормоза при других запросах, плюс большие тормоза при инсертах. А при инсерте ты локаешь таблицу, а значит все те кто реквестит на вывод топика, сидят и курят.
 
Эти твои индексы будут как камень на шее у мускула, юзать он их будет раз в пятилетку, зато то, что он делает каждую секунду, ты его душишь.
 
alexei

Цитата:
Хотя есть конечно идейка, фильтровать левым скриптом, скидывать туда порядок вывода, а потом вытягивать его оттуда при выводе в forums.cgi.  

 
ты когда меня спросил, ты что спросил?
Ты спросил, хочу делать на дбм, вот есть хеш, как мне выводить топики по странично.
Я тебе сказал, нужно юзать второй хеш, верно?
 
Почему так нужно ты не помнишь?
 
Потому что при таком варианте при выводе допустим пятой страницы списка топиков, ты пишешь

Код:
 
for (101..120){
print $hash{$index{$_}}\n;
}
 

И это все! никаких переборов метрового хеша, сплитований, сортировок, проверок итд итп. Все быстро и просто.
А ты тут сидишь и думаешь, а как теперь построить хеш, чтобы юзать фичи, а вот левый скрипт может написать, еще что-то.
ну давай давай, пиши левый скрипт, вешай его на крон, пусть он тебе каждые пять минут ломится и делает индекс всего контента, загружая при этом сервер,  ради того, чтобы фича не притормаживала, юзаемая раз в пол года даже на таком посещаемом форуме как руборд.
Успехов.
 
 
 
 
Добавлено
да, насчет структуры, мне не нравится и все.
Лучше я не могу предложить, ибо не знаю как у тебя все остальное выглядит.
Как ты посты хранишь, топики, да и вообще все остальное...
 

Всего записей: 12593 | Зарегистр. 07-01-2001 | Отправлено: 13:29 05-06-2002
alexei



ibhacker
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
batva

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

Но у тебя то эта фишка работает, значит реально сделать. При чем во всех форумах предлагается ее юзать перед тем как создавать новую тему, соотв. или же никто ее не юзает(бред, сам много раз юзал) или же она действительно работает. А насчет левого скрипта ты неправильно понял. Я думаю сделать так если юзер выбирает sort by lastpost тогда юзать стандартный хеш, если выбирает другой быстро пробегаемся по основоному хешу и формируем новый хеш с номерами топиков, скидываем его в файл. Когда юзер хочет перейти на стр№2 то берем ключи не с основного хеша, а с дополнительного. После некоторого времени можно доп. хеш снсить тем же cron'om.
Вот сейчас полностью разберусь с DBM Filters и буду думать

Код:
# DBM Filters
$old_filter = $db->filter_store_key  ( sub { ... } ) ;
$old_filter = $db->filter_store_value( sub { ... } ) ;
$old_filter = $db->filter_fetch_key  ( sub { ... } ) ;
$old_filter = $db->filter_fetch_value( sub { ... } ) ;

 

Цитата:
да, насчет структуры, мне не нравится и все.
Лучше я не могу предложить, ибо не знаю как у тебя все остальное выглядит.
Как ты посты хранишь, топики, да и вообще все остальное...

А всего остального еще нет, я же с нуля пишу и нет проблем подогнать в будущем все под предложеный тобою вариант. Поэтому за любые предложения буду благодарен.

Всего записей: 647 | Зарегистр. 06-07-2001 | Отправлено: 15:47 05-06-2002
Alexander Ipp



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
alexei
Неееееее, бред.
Ну я вот юзал этот вильтр за всё время пребывания на РУ.борде (немалое...) всего два-три раза.
Не надо никакого крона и доп. хешей. Здесь они не нужны! Пусть лучше сортировка тормозит в пределах разумного. Хеши создавать - тоже тормоз. И тереть их...
А фильтр ака поиск ты так не ускоришь.
Только  сортировку...

Всего записей: 1943 | Зарегистр. 20-08-2001 | Отправлено: 21:01 07-06-2002
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » IkonBoard и другие форумы » Ikonboard v.2 » iB 2 на dbm


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru