ээээ...
я думал про кластеры на винте (типа чем больше кластер тем меньше голока винта юрзает в начало винта/ищет адреса/...), т.о. скорость чтения увеличивается (хотя 60мб/с не думаю что удастся сильно поднять)
можно размерчик этого кластера :))
так решусь поднять тему...
грубо говоря структура индеса:
слово (в НФ) -> список страниц (возможно указание позиции и форма слово = число падежь...)
поэтому %hash слов (каждое слово сожержит указатель на начало массива/списка страниц)...
дальше не могу представить как хранить эти массивы страниц...
-была мысль в хэше слов хранить сериализованный (ну как в php = массив2строка) массив страниц. Но это выходит что строки эти будут измеряться метрами (допустим в словаре будет 300 000 слов * 2М ~ 300ГБ). В принципе 300ГБ на raid массиве это не проблема.
Но меня волнует скорость индексирования = извлечь массив, deserialize, вставить индекс страницы, serialize, обновить значение хэша (а если еще и сжатие строки применять...)
-еще можно в памяти индексатора держать хэш слов (у каждого слова уникальный word_id) и хэш страниц (тоже page_id) и составлять тоже типа хэша (имя элемента word_id, значения page_id, и потом word_pos... ) но проблема в том что и хэш слов и страниц пополняется (хэш слов не так быстро, а вот хэш страниц...), тогда придется делать индексатор демоном (а у меня сейчас crawler запускает indexer при каждой новой страничке)
жаль...
скрипт написал, потом стал становится на такие вот грабли... начал рыть, потом верить в чудеса :)....
я немного подругому сделал...
я подавал на вход урл без базового... (ваша мысль с $base мне ольше нравится)
$host->{name} = например site.ru
$host->{www} = некоторый сайты не отвечают без www = поэтому приходится смотреть вдруг ссылка указана абсолютная да еще и с www
# # analyseURL($url) # sub analyseURL { $_[0] =~ s/\n//; my $url = $_[0]; if ( substr($url, 0, 1) eq '#' || $url =~ /mailto:|javascript:/i ) { return 0; } # search http:// or www. or http://www. if ( $_[0] =~ /^http:\/\/www\.|^http:\/\/|^www\./i ) { if ( $_[0] =~ /^http:\/\/(www\.$host->{name})|(^http:\/\/$host->{name})|(^www\.$host->{name})/i ) { if ( defined($1) || defined($3) ) # http://www.$host or www.$host { $host->{www} = "www."; } elsif ( defined($2) ) # http://$host { $host->{www} = ""; } $_[0] =~ s/http:\/\///i; $_[0] =~ s/www\.//i; } else { return 2; } } # replace 'server' from url $_[0] =~ s/^$host->{name}//i; # if page not absolute if ( substr($_[0], 0, 1) ne '/' ) { $query =~ /(.*\/)/i; $_[0] = $1.$_[0]; } #if url contain ../ $_[0] =~ s/[^\/]*?\/\.\.\//\//g; #if url contain ./ $_[0] =~ s/\.\///g; #if url contain //// $_[0] =~ s/\/+/\//g; # replace SESSIONID $_[0] =~ s/\&/&/g; # replace navigate on page #name if ( $_[0] =~ /\#/ ) { $_[0] =~ s/\#[0-9a-z_\-]+$//i; $_[0] =~ s/\#[0-9a-z_\-]+\?/?/i; $_[0] =~ s/\#[0-9a-z_\-]+\&/&/i; } $_[0] =~ s/\?$|\&$//; return 1; }
что то я не догоняю как вычислить "базовый URI для этой страницы"
можно примерчик (perl / php ///)
ээээ, но люди то все равно пишут в html www.site.ru/path !!без /!! сервер то разберется что делать... а вот я...
вот блин. а я этот /path использую потом...
= нашел все ссылки по запросу site.ru/path
но потом то он должен запросить все ссылки, который нашел на site.ru/path (а они могут быть относительными...) вот и фиг его знает как дальше быть, какой запрос делать site.ru/path/url_on_path ? а вдруг это файл, и запрос нуно такой site.ru/url_on_path :(
Miha Kuzmin (KMY), :)) , надо больше спать...
а вопрос собственно такой
мой робот конектится на сайт site.ru
делает запрос /
получает страницу и выуживает все ссылки (/news/, /forum/index.php, ..., /path)
затем конектится на сайт site.ru и делает запрос /news/
как определить /path это /path/ (т.е. директория) или файл
эх блин ...
спаибо!
lagif, полностью согласен по поводу ОС но все же пока посижу на форточке :)...
а на счет реализации двух скриптов кто как думает... может вообще извращнуться crawler скачал страничку и запустил
indexer -f путь_к_скачанной_странице :) по детски конечно :)) но зато нет потерь по передаче через сокеты, минус в том что память улетучиваться будет :(