Nam3D, автор в теме давал вполне чёткие пояснения:
---------- Добавлено 17.09.2014 в 00:14 ----------Кстати, если уж говорить про зависимость решения от железа, языка программирования, ОС и т.п., то ключевым является наличие неблокируемых сокетов. Сеть будет самым медленным звеном.
P.S. На всякий случай дам ссылку на статью про миллион соединений http://habrahabr.ru/post/123154/
"Лучше день потерять, потом за пять минут долететь." (c) Крылья, ноги и хвосты
У автора темы простая и предельно понятная задача: "обойти все домены в зоне .ru и проверить главную страницу на вхождение определённой строки". В теме вспомнили много разных языков, но не уверен, что приблизили автора к выбору чего-то конкретного. При этом нет гарантии, что после написания программы окажется, что не учли какую-нибудь особенность, из-за которой всё надо начинать сначала.
Мне стало интересно, в какие ресурсы упрётся паук на большом объёме доменов, поэтому решил набросать решение, на что ушло 20 минут. Вот скрипт:
var fs = require('fs'), async = require('async'), request = require('request'); var selcount = 1000; // Количество тестируемых доменов var reg = /windows-1251/im; var total_processed = 0; var total_matched = 0; var total_errors = 0; var main_task = function(url, callback) { total_processed++; request(url, function (error, response, body) { if (!error && (response.statusCode == 200)) { if (body.match(reg)) { total_matched++; } return callback(); } else { total_errors++; return callback(); } }); }; var queue = async.queue(main_task, 200); // Максимальный размер параллельных задач queue.drain = function(err) { if (err) { console.log('ERROR in drain: ' + err); } worktime = (new Date().getTime()) - worktime; console.log('Processed ', total_processed, ' tasks'); console.log('with errors: ', total_errors); console.log('matched: ', total_matched); console.log('Total time: ', worktime, ' ms'); console.log('per url: ', worktime / total_processed, ' ms'); } var all_domains = fs.readFileSync('ru_domains', {'encoding': 'utf-8'}).split('\n'); console.log('Found ', all_domains.length, ' domains'); var worktime = new Date().getTime(); while (selcount > 0) { selcount--; queue.push('http://' + all_domains[Math.floor(Math.random() * all_domains.length)].split('\t')[0]); }
Для запуска надо скачать nodejs, потом поставить зависимости "npm install request async" и запустить.
Чтобы понять динамику поигрался параметрами. Вот пример нескольких запусков:
>node spider.js Found 4143226 domains Processed 10 tasks with errors: 4 matched: 1 Total time: 2268 ms per url: 226.8 ms >node spider.js Found 4143226 domains Processed 100 tasks with errors: 52 matched: 13 Total time: 42932 ms per url: 429.32 ms >node spider.js Found 4143226 domains Processed 1000 tasks with errors: 470 matched: 147 Total time: 102080 ms per url: 102.08 ms >node spider.js Found 4143226 domains Processed 3000 tasks with errors: 1493 matched: 349 Total time: 134085 ms per url: 44.695 ms
Можно заметить, что примерно половина доменов не отвечает на запросы. Частично это может быть связано с двухлетней давностью базы (когда-то была скачена), но, подозреваю, что проблема просто в массовых регистрациях доменов.
Основной причиной задержек являлись подвешенные соединения, которые отваливались лишь по таймауту. Тут самый простой путь - это кардинально уменьшить таймаут.
P.S. Считаете, что на другом языке будет быстрее? Тогда приведите ваше решение, а я попробую оптимизировать своё. Батл пауков?
На C-подобных языках можете заработать головную боль при работе с памятью, со всеми вытекающими.
Я бы взял node.js + async + request. Программа получится строк на 50. Если окажется, что упираетесь в CPU, а не ширину канала, то придётся несколько экземпляров запускать.
P.S. Тут уже предупреждали, что DNS положите, поэтому DNS провайдера лучше не использовать.
Знаю, что надо под Windows, но для себя проблему решил просто: monit стоит на домашнем роутере и пингует как мой сервер, так и сервер Яндекса. В результате получаю отчёт не только по доступности веб-сервера, но и о доступности домашнего Интернета)
Решил попробовать сервис в бесплатном варианте, прочитал, что сейчас 100 фраз можно бесплатно. Попробовал добавить и получаю ошибку, что мой тариф столько не поддерживает. Выяснилось, что 99 можно, а 100 нельзя.
Думаю, что где-то в коде надо исправить "< 100" на "= 100", либо в условиях тарифа написать, что бесплатно идёт проверка 99.99 фраз))---------- Добавлено 15.09.2014 в 08:52 ----------и у меня опечатка, вместо "< 100" и "= 100" лучше использовать "<= 100"
Здравствуйте!
Когда для сайта создавал поддержку на стороне вконтакте, то создал "страницу". Сейчас смотрю, что большинство предложений связано с группами.
Собственно, у меня пара следующих связанных вопросов:
а) какая основная разница для проекта между страницами и группами?
б) есть ли предложение по привлечению живых пользователей, желательно не оферов, на подписку на страницу?
Спасибо!