2016-03-17 61 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