Как управлять границей URL-адресов поискового робота?

Ребята

У меня есть следующий код для добавления посещенных ссылок в мой сканер. После извлечения ссылок у меня есть цикл for, который проходит через каждый отдельный тег href.

И после того, как я посетил ссылку, открыл ее, я добавлю URL-адрес в переменную коллекции посещенных ссылок, определенную выше.

private final Collection<String> urlForntier = Collections.synchronizedSet(new HashSet<String>()); 

Реализация сканера является многопоточной, и предполагается, что если я посетил 100 000 URL-адресов, если я не завершу работу сканера, он будет расти день ото дня. и это создаст проблемы с памятью? Пожалуйста, какой вариант у меня есть, чтобы обновить переменную, не создавая несоответствия между потоками?

Заранее спасибо!


person Daniel Adenew    schedule 18.11.2015    source источник


Ответы (2)


Самый удобный способ для современных систем сканирования — использовать базы данных NoSQL.

Это решение заметно медленнее, чем HashSet. Вот почему вы можете использовать различные стратегии кэширования, такие как Redis или даже фильтр Блума

Но включая специфику URL, я хотел бы порекомендовать структуру данных Trie, которая дает вам много вариантов управления и поиска по строке URL. (Обсуждение реализации Java можно найти в этом Stackoevrflow тема)

person Dewfy    schedule 18.11.2015
comment
Спасибо Дьюфи! Интересно, когда переменная будет очищена, если я пробегу около 10000 лет, сколько памяти мне тогда понадобится? как решить это? даже несмотря на то, что я использую Trie Stacture, которую вы предложили - person Daniel Adenew; 18.11.2015
comment
@danielad из открытой статистики Google, средняя длина URL-адреса составляет 90 символов, на сегодняшний день Google сообщает о 50 миллиардах (5 * 10 ^ 10) веб-страниц. Некоторые реализации Trie утверждают, что мы можем сохранить эту структуру с эффективностью памяти как O (N) . Делаем простое умножение 90*5*10^10 = 4.5*10^12(байт) = 4191(Гб) Не такое уж большое число для современного компьютера - person Dewfy; 18.11.2015

  1. Что касается вопроса, я бы рекомендовал использовать Redis вместо использования Collection. Это база данных в памяти для хранения структуры данных и очень быстрая вставка и извлечение данных с поддержкой всех стандартных структур данных. В вашем случае Set, и вы можете проверить наличие ключа в наборе с помощью SISMEMBER команда).

  2. Apache Nutch также полезно изучить.

person Anupam    schedule 18.11.2015