2016-03-17 63 views
0

我有一組文件。每個文件應包含一組所有文件中的唯一行。例如,如果文件I包含行「1號線」,則沒有其他文件應該有一行「1號線」(也文件I應包含「1號線」的1項)查找/刪除BigData中的重複項

問題:

我需要刪除所有來自這些文件的重複。但是,總行數超過了數十億,所以我無法真正將所有文件壓入內存並刪除。

我想幾個解決方案:

1到數據庫中創建一個表,並使用每一行作爲一個獨特的密鑰,然後由所有的行扔進DB我們將刪除所有重複。

2-使用Redis設置結構而不是DB。

3-創建一個文件行作爲文件的名稱。因此,一旦所有文件自然創建,重複將消失。

但是,我能想到的每個解決方案都需要非常大量的時間和資源,目前我無法負擔得起。

所以我的問題是:

基於上述方案

1,哪條路線似乎更可靠?

2-有沒有更好的解決方案/我不知道的技術?

+0

@Ilja我不是要求密碼。我在尋求想法。我已經提出了3個解決方案,我知道這些工作但是「相信」代價高昂,我不知道這是多麼昂貴。 – nafas

+0

'cat file_1 file_2 ... file_n |排序| uniq' –

+0

也許你可以散列(例如md5)每行以減少使用的內存/空間。 – LFI

回答

1

您需要通過具有相同散列值的子文件分割每個文件,然後比較這些子文件。例如,您只有2個文件,F1和F2,並且需要刪除重複的文件。要做到這一點,你需要通過下面的算法拆分每個文件到N smalles文件:

int N = 1024; // split huge file to 1024 subfiles; must be 2^n 
FILE *f_arr[N]; 
for(i = 0; i < N; i++) { 
    sprinf(buf, "file.%04u", i); 
    f_arr[i] = fopen(buf, "w"); 
} 

while(fgets(buf, sizeof(buf), in_file)) { 
    int hash = hash_func(buf); 
    fputs(buf, f_arr[hash & (N - 1)]); 
} 

由於這兩個文件F1和F2將有相同的哈希值「1號線」(例如,56),分離期間,它轉到子文件F1.0056和F2.0056。

此後,您可以迭代每個具有相同編號的子文件對,並刪除重複項。

+0

非常有用的信息隊友,ty – nafas