2015-11-18 19 views
-1

夥計如何管理抓取工具網址前沿?

我有以下代碼在我的搜尋器上添加訪問過的鏈接。 提取鏈接後,我有一個循環循環通過每個人href標籤

當我訪問了一個鏈接後,打開它,我將URL添加到上面定義的訪問鏈接集合變量中。

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

履帶實現mulithread,如果我訪問過的網址100000,如果我沒有終止履帶就會一天天茁壯成長承擔。它會造成內存問題?請問,我有什麼選擇來刷新變量而不會在線程間產生不一致?

提前致謝!

回答

1

現代爬行系統最實用的方法是使用NoSQL數據庫。

該解決方案比HashSet慢得多。這就是爲什麼你可以利用不同的緩存策略就像一個Redis,甚至Bloom filter小號

但是包括URL的特殊性質,我想推薦Trie數據結構,它爲您提供了很多的選擇操作,並通過URL字符串搜索。 (Java實現的討論可以在此Stackoevrflow topic找到)

+0

謝謝Dewfy!我想知道什麼時候變量會被清除,如果我運行了10000年,那麼我需要多少memeory?如何解決這個問題?即使你使用的Trie stacture u建議 – danielad

+0

@danielad來自谷歌的平均URL長度是90個符號,因爲今天Google報告了大約50億(5 * 10^10)個網頁,有些Trie實現聲明我們可以保留這個結構的記憶效率爲O(N)。簡單的乘法運算'90 * 5 * 10^10 = 4.5 * 10^12'(字節)= 4191(Gb)現代計算機 – Dewfy

+0

的數量並不是很大,哇! – danielad

0
  1. 由於每個問題,我會建議使用Redis來代替使用收集的。它是用於數據結構存儲的內存數據庫,支持所有標準數據結構的超快速插入和檢索數據。在您的案例Set中,您可以使用SISMEMBER命令檢查是否存在密鑰集)。

  2. Apache Nutch也很好的探索。