如何從大量URL中找出相同的URL?

2022-07-04 09:03:14 字數 890 閱讀 2519

給定 a、b 兩個檔案,各存放 50 億個 url,每個 url 各佔 64b,記憶體限制是 4g。請找出 a、b 兩個檔案共同的 url。

每個 url 佔 64b,那麼 50 億個 url占用的空間大小約為 320gb。

5,000,000,000 * 64b ≈ 5gb * 64 = 320gb

由於記憶體大小只有 4g,因此,我們不可能一次性把所有 url 載入到記憶體中處理。對於這種型別的題目,一般採用分治策略,即:把乙個檔案中的 url 按照某個特徵劃分為多個小檔案,使得每個小檔案大小不超過 4g,這樣就可以把這個小檔案讀到記憶體中進行處理了。

思路如下:

首先遍歷檔案 a,對遍歷到的 url 求hash(url) % 1000,根據計算結果把遍歷到的 url 儲存到 a0, a1, a2, ..., a999,這樣每個大小約為 300mb。使用同樣的方法遍歷檔案 b,把檔案 b 中的 url 分別儲存到檔案 b0, b1, b2, ..., b999 中。這樣處理過後,所有可能相同的 url 都在對應的小檔案中,即 a0 對應 b0, ..., a999 對應 b999,不對應的小檔案不可能有相同的 url。那麼接下來,我們只需要求出這 1000 對小檔案中相同的 url 就好了。

接著遍歷 ai(i∈[0,999]),把 url 儲存到乙個 hashset 集合中。然後遍歷 bi 中每個 url,看在 hashset 集合中是否存在,若存在,說明這就是共同的 url,可以把這個 url 儲存到乙個單獨的檔案中。

本題是記憶體小、檔案大,無法一次性處理檔案,因此聯想到將大檔案分割成小檔案,那麼如何進行分割就成了核心關鍵點。要求兩大檔案分割完畢後有一定的規律性,這裡可使用雜湊演算法,若存在相同url,那麼這兩個url肯定在相對應的小檔案中。

如何從大量資料中找出高頻詞?

有乙個 1gb 大小的檔案,檔案裡每一行是乙個詞,每個詞的大小不超過 16b,記憶體大小限制是 1mb,要求返回頻數最高的 100 個詞 top 100 由於記憶體限制,我們依然無法直接將大檔案的所有詞一次讀到記憶體中。因此,同樣可以採用分治策略,把乙個大檔案分解成多個小檔案,保證每個檔案的大小小於...

如何找出最小偏向角 如何從大量資料中找出高頻詞?

有乙個 1gb 大小的檔案,檔案裡每一行是乙個詞,每個詞的大小不超過 16b,記憶體大小限制是 1mb,要求返回頻數最高的 100 個詞 top 100 由於記憶體限制,我們依然無法直接將大檔案的所有詞一次讀到記憶體中。因此,同樣可以採用分治策略,把乙個大檔案分解成多個小檔案,保證每個檔案的大小小於...

在大量URL中,查詢出現次數前K多的URL

include include include include include include using namespace std using namespace stdext void findtopktimes const string filename priority queue,vec...