- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
В 2023 году Google заблокировал более 170 млн фальшивых отзывов на Картах
Это на 45% больше, чем в 2022 году
Оксана Мамчуева
Все что нужно знать о DDоS-атаках грамотному менеджеру
И как реагировать на "пожар", когда неизвестно, где хранятся "огнетушители
Антон Никонов
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
сам алгоритм работы (одного процесса) уже более менее отработан...
вот хочу теперь внедрить многопоточность и многопроцессность (наверное придется писать еще и crawler_manager)
в зависимости от чего регулировать количество потоков/процессов ?
Ну если с трафиком проблем нет - то наращивать, пока загрузка процессора не будет близка к 100%. (Либо пока канал не загрузится полностью - смотря что раньше наступит).
В зависимости от количества физических процессоров на машине и количества файловых дескрипторов которые можно открыть одновременно это если у Вас правильная многопоточность в одном процессе а если Вы собираетесь форкаться то еще и память будет использоваться на каждый процесс достаточно много чтобы это было ограничением.
Cейчас crawler на perl'e. Но думаю переписывать на java (встроенная многопоточность). Схему контроля думаю сделать такой:
-у crawler_manager'a есть список сайтов
-например manager запустил на скачку 10 crawler'ов
-те начинают качать... например на главной страничке 20 ссылок... у crawler'a составляется список страниц данного сайта... crawler запускает 20 потоков (на каждую страницу 1 поток)... каждый поток отслылает crawler'y время получения страницы... crawler суммирует время от всех потоков... (хотя нет, они же параллельно работают... тогда выбирает максимум) и отпраляет это значение crawler_manager'y тот в свою очередь сравнивает показания всех 10 crawler'ов (так же еще он память должен смотреть...) и принимает решение запустить на скачку еще 1 сайт или сказать crawler'y, который больше всего времени ждет сервер, что нужно остановить поток, или вообще остановить crawler...
списки сайтов и стрниц сайтов ( + флаги ) думаю хранить в key-value БД (почитал этот форум... все говорят что юзать СУБД накладно...). нашел berkeley-db java edition...
вот только думаю не сильно-ли завернутая схема... кто какую схему применяет вообще, и стоит ли на java все это делать (почему решил java = анализ тектса + потоки + пороще С++)...
Если crawler написан правильно, то у вас раньше исчерпается канал или же вы достигните максимума скорости записи на диск, нежели доведёте загрузку процессора до 100%, поэтому при построении планировщика лучше закладываться на задаваемые лимиты скорости канала и скорости записи на диск.
Это если не индексировать на ходу, то в диск/канал упрешься. А с индексированием - как раз скорее всего именно в процессор.
-например manager запустил на скачку 10 crawler'ов
-те начинают качать... например на главной страничке 20 ссылок... у crawler'a составляется список страниц данного сайта... crawler запускает 20 потоков (на каждую страницу 1 поток)... каждый поток отслылает crawler'y время получения страницы... crawler суммирует время от всех потоков... (хотя нет, они же параллельно работают... тогда выбирает максимум) и отпраляет это значение crawler_manager'y тот в свою очередь сравнивает показания всех 10 crawler'ов (так же еще он память должен смотреть...) и принимает решение запустить на скачку еще 1 сайт или сказать crawler'y, который больше всего времени ждет сервер, что нужно остановить поток, или вообще остановить crawler...
По-моему слишком сложно. Существуют готовые средства для очередей, с готовыми же блокировками. Можно держать общую на весь процесс очередь заданий на скачивание, пул потоков-рабочих - которые достают задание из очереди, и выполняют, и поток-контроллер - который мониторит размер очереди, если он превышает какой-то порог - порождает новые потоки (до определенного предела), если наоборот - останавливает старые.
Страниц, которые предстоит выкачать? По идее имеет смысл их хранить в коллекциях java, и готовыми же методами "зеркалить" в БД, с помощью ORM типа hibernate.
Ну Java это вообще штука сильно на любителя. :) Посмотрите еще в сторону python - для качальных дел неплох, да и сам по себе язык приятный очень.
Если есть сложный анализ текста то возможно что процессор будет основным ограничением а по поводу пропускной способности канала возможно что процессор тоже будет ограничением потому что TCP/IP набор протоколов тоже надо кому то обрабатывать.
Думаю, с одновременным индексированием упретесь все-таки в проц. ресурсы и память. А что значит "встроенная многопоточность"? На мой взгляд, многопоточность есть практически везде, где есть форканье и треды.
А вот на джаве программить не люблю: конечный продукт сожрет больше ресурсов, чем та же прога, написанная на сях или перле... мое личное наблюдение.
Ну Java это вообще штука сильно на любителя. :) Посмотрите еще в сторону python - для качальных дел неплох, да и сам по себе язык приятный очень.
Это скорее python на любителя, ...
C без плюсов уже не модно?
Думаю, с одновременным индексированием упретесь все-таки в проц. ресурсы и память.
Скорее в seek для дисковых действий если все делать просто без особых наворотов, или в память и количество файловых дескрипторов если держать много файлов открытыми чтобы пореже буфера на диск сбрасывать, или если буфер один но большой для базы данных на одном файле то в память.
По-моему слишком сложно. Существуют готовые средства для очередей, с готовыми же блокировками. Можно держать общую на весь процесс очередь заданий на скачивание, пул потоков-рабочих - которые достают задание из очереди, и выполняют, и поток-контроллер - который мониторит размер очереди, если он превышает какой-то порог - порождает новые потоки (до определенного предела), если наоборот - останавливает старые.
вот интересен этот порог... как его посчитать... (там же потом еще и индексирование будет работать...) А что за готовые средства... попобдромнее можно.?..
Ну Java это вообще штука сильно на любителя. Посмотрите еще в сторону python - для качальных дел неплох, да и сам по себе язык приятный очень.
про java да, согласен -)) есть повод изучить его получше...
на питон смотрел раньше чем на java, подкупает еще и тем что google на нем роботов написал -)
Нет. Форки - это форки, со всей радостью в виде неудобной IPC, заботы о блокировках и т. п.
А треды к примеру в том же перле - нельзя юзать, многие либы не thread-safe, в частности самые ходовые LWP и HTML::Parser/HTML::Tree.
На С писать с тредами? Это попухнуть можно. Прибавка в скорости просто не стоит седых волос. :)
Да на глазок. Он же особого смысла не несет - допустим в очереди 10000 урлов - значит надо еще добавить качальщиков, или наоборот - очередь пустует - значит надо покилять качальщиков, чтоб процессор у индексаторов не отбирали.
Я имею ввиду работу с очередями.
http://www.python.org/doc/2.4.2/lib/module-Queue.html - отличная штука. Просто до безобразия, полностью thread-safe - в общем от кучи лишней работы избавляет.