單機海量哈希去重算法

科技 未結 7 513
ck七一
ck七一 2023-06-17 21:14

單機環(huán)境,有大約1TB硬盤裝滿了md5哈希,里邊有重復的,怎樣才可能最快速度踢出重復的。內存大小限定為512MB吧

我實際遇到的一個問題,我去知乎提問了。居然被管理員封了,說我“代為解決個人問題”
https://www.zhihu.com/questio...

我把我知乎的回復抄過來

居然有人投訴說"代為完成個人任務",也是醉了。這個問題不是面試題,也不是啥個人問題。是我實實在在遇到的問題。我有個思路,實現(xiàn)也簡單,但是預估計跑完得個把星期了。

現(xiàn)在有兩T,1TB是數(shù)據(jù),另外1TB用來存放結果。

我現(xiàn)在沒有啥特別好的思路。只有最簡單的優(yōu)化。
分文件

A分區(qū)存1TB數(shù)據(jù),B分區(qū)空閑

MD5hash 特點0~9a-f 總共16種情況 總共32個字符。

第一步分級
分兩級

第一級 0·f 總公16個目錄
第二級 0-f 總共16 個文件

那么這樣下來我們總共會有256個文件

從A分區(qū)中順序讀取哈希,哈希的第一個字母情況根據(jù)目錄進行分類;
哈希的第二個字母進行文件分類;對于任意一個A分區(qū)中的數(shù)據(jù),會通過前兩個字母定位
到這256個文件中的某一個;

順序遍歷A分區(qū)數(shù)據(jù),完成全部操作之后會生成256個文件。

第二步
此時就轉化成為將256個小一點的文件進行去重;

對于小一點的文件去重;

分塊讀入內存進行堆排序,進行一次順序遍歷則可以剔除重復數(shù)據(jù);

對于兩個已經分塊的順序數(shù)據(jù)合并去重;這種情況相當于“”有序單鏈表合并問題“”
很容易做到;

依次重復1.2兩步可以將這256個小文件去重;此時得到結果

這是我想的一個簡單辦法,但是估算了一下時間可能要個把星期。。。好久

7條回答
  •  360U3058061266
    2023-06-17 21:38

    硬盤最好是2個,避免讀寫沖突。 第二個空硬盤當作平坦空間用,用來標記重復值,而不是把哈希值從A盤復制出來。

提交回復