海量資料實戰 從50億資料中找出相同的URL

2021-10-20 09:53:09 字數 883 閱讀 9505

**問題:**給定a、b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4g,讓你找出a、b檔案共同的url?

目錄:step 3 使用set將小檔案進行求交操作,最終得到相同url

方案1:每個檔案50億個url,每個url最長64個位元組,可以估計每個檔案安的大小為5000,000,000 ×64bit=320,000,000,000bit ≈ 300,000g,遠遠大於記憶體限制的4g,同時需要大硬碟(這裡不考慮分布式計算)。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。

方案2:如果允許有一定的錯誤率,可以使用bloom filter,4g記憶體大概可以表示340億bit。將其中乙個檔案中的url使用bloom filter對映為這340億bit,然後挨個讀取另外乙個檔案的url,檢查是否與bloom filter,如果是,那麼該url應該是共同的url(注意會有一定的錯誤率)。

讀者反饋@crowgns:

hash後要判斷每個檔案大小,如果hash分的不均衡有檔案較大,還應繼續hash分檔案,換個hash演算法第二次再分較大的檔案,一直分到沒有較大的檔案為止。這樣檔案標號可以用a1-2表示(第一次hash編號為1,檔案較大所以參加第二次hash,編號為2)

由於1存在,第一次hash如果有大檔案,不能用直接set的方法。建議對每個檔案都先用字串自然順序排序,然後具有相同hash編號的(如都是1-3,而不能a編號是1,b編號是1-1和1-2),可以直接從頭到尾比較一遍。對於層級不一致的,如a1,b有1-1,1-2-1,1-2-2,層級淺的要和層級深的每個檔案都比較一次,才能確認每個相同的uri。

以上是網上流傳最廣的思路,基於以上想法。我主要有兩點想法,

以下是對上述演算法的實現,

從海量資料中找出中位數

題目 在乙個檔案中有 10g 個整數,亂序排列,要求找出中位數。記憶體限制為 2g。只寫出思路即可 記憶體限制為 2g的意思就是,可以使用2g的空間來執行程式,而不考慮這台機器上的其他軟體的占用記憶體 關於中位數 資料排序後,位置在最中間的數值。即將資料分成兩部分,一部分大於該數值,一部分小於該數值...

從海量資料中找出中位數

題目 在乙個檔案中有 10g 個整數,亂序排列,要求找出中位數。記憶體限制為 2g。只寫出思路即可 記憶體限制為 2g的意思就是,可以使用2g的空間來執行程式,而不考慮這台機器上的其他軟體的占用記憶體 關於中位數 資料排序後,位置在最中間的數值。即將資料分成兩部分,一部分大於該數值,一部分小於該數值...

海量資料實戰 用SQL做資料分析的高效路徑,爽啊!

如今,全球早已步入資料時代,隨著行業的高速發展,相關崗位缺口已超150萬,且薪資超同行業50 未來十年,資料細分崗位將擴張5倍,各行業資料人才缺口明顯。很多人想抓住機遇進入資料分析行業,卻經常遇到以下問題 在這裡,不得不為大家推薦這個開課吧的 大資料分析實戰課 4大實戰專案,帶你操作真實業務場景下的...