Ответ 1
Итак, в первую очередь, я бы не стал беспокоиться о том, чтобы попасть в распределенное сканирование и хранение, потому что, как следует из названия, для этого требуется приличное количество машин для получения хороших результатов. Если у вас нет фермы компьютеров, то вы не сможете извлечь из этого выгоду. Вы можете создать искатель, который получает 300 страниц в секунду и запускает его на одном компьютере с подключением 150 Мбит/с.
Следующая вещь в списке - определить, где ваше узкое место.
Контрольная точка вашей системы
Попробуйте устранить MS SQL:
- Загрузите список, скажем, 1000 URL-адресов, которые вы хотите обходить.
- Определите, как быстро вы можете их обходить.
Если 1000 URL-адресов не дают вам достаточно большой обход, то получите 10000 URL-адресов или 100 тыс. URL-адресов (или если вы чувствуете себя храбрыми, то получите Alexa top 1 млн.). В любом случае, попытайтесь установить базовую линию с максимально возможными исключениями.
Определить узкое место
После того, как у вас есть базовая линия для скорости сканирования, попробуйте определить, что вызывает замедление. Кроме того, вам нужно будет начать использовать многоуровневое управление, потому что вы привязаны к i/o, и у вас есть много свободного времени между извлечением страниц, которые вы можете потратить на извлечение ссылок и выполнение других действий, таких как работа с базой данных.
Сколько страниц в секунду вы получаете сейчас? Вы должны попробовать и получить более 10 страниц в секунду.
Улучшить скорость
Очевидно, следующий шаг - как можно больше настроить ваш искатель:
- Попытайтесь ускорить работу своего искателя, чтобы он преодолел жесткие ограничения, например, вашу пропускную способность.
- Я бы рекомендовал использовать асинхронные сокеты, так как они МНОГО быстрее, чем блокирующие сокеты, WebRequest/HttpWebRequest и т.д.
- Используйте более быструю библиотеку разбора HTML: начинайте с HtmlAgilityPack, и если вы чувствуете себя храбрым, попробуйте Majestic12 HTML Parser.
- Используйте встроенную базу данных, а не базу данных SQL и воспользуйтесь хранилищем ключей/значений (хешируйте URL-адрес ключа и храните HTML-код и другие соответствующие данные как значение).
Go Pro!
Если вы освоили все вышеперечисленное, я бы предложил попробовать попробовать! Важно, чтобы у вас был хороший алгоритм выбора, который имитирует PageRank, чтобы сбалансировать свежесть и охват: OPIC в значительной степени является последним и самым большим в этом отношении (AKA Adaptive Расчет эффективности страниц в Интернете). Если у вас есть вышеуказанные инструменты, вы должны иметь возможность реализовать OPIC и запускать довольно быстрый искатель.
Если вы гибки на языке программирования и не хотите слишком далеко отклоняться от С#, тогда вы можете попробовать сканеры уровня предприятия на основе Java, такие как Nutch. Nutch интегрируется с Hadoop и всеми другими масштабируемыми решениями.