0

彼ら

クローラーに訪問済みリンクを追加する次のコードがあります。リンクを抽出した後、個々のhref タグをループするfor ループがあります。

そして、リンクにアクセスして開いた後、上で定義した訪問済みリンク コレクション変数に URL を追加します。

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

クローラーの実装はマルチスレッドであり、100,000 の URL にアクセスした場合、クローラーを終了しなければ、日々成長すると想定しています。メモリの問題が発生しますか?スレッド間で矛盾を生じさせずに変数を更新するには、どのオプションが必要ですか?

前もって感謝します!

4

3 に答える 3

1

最新のクロール システムで最も使いやすい方法は、NoSQLデータベースを使用することです。

このソリューションは、 よりも著しく遅くなりHashSetます。そのため、 RedisBloom filterなどのさまざまなキャッシュ戦略を活用できます

しかし、URL の特定の性質を含めて、URL 文字列で操作および検索するための多くのオプションを提供するTrieデータ構造をお勧めします。(Java 実装の議論は、この Stackoevrflowトピックにあります)

于 2015-11-18T12:18:04.267 に答える
-1
  1. 質問によると、Redisを使用してコレクションの使用を置き換えることをお勧めします。これは、データ構造ストア用のメモリ内データベースであり、すべての標準データ構造をサポートしてデータを挿入および取得するのが非常に高速です。

  2. Apache Nutchも探索するのに適しています。

于 2015-11-18T12:54:46.917 に答える