在BigData中查找/删除重复项

时间:2016-03-17 12:14:38

标签: mysql linux algorithm redis

我有一组文件。每个文件应包含所有文件中的一组唯一行。例如,如果File i包含“Line 1”行,那么其他文件不应该有“Line 1”行(同时文件i应该包含1行“Line 1”)

问题:

我需要从这些文件中删除所有重复项。然而,总行数超过数十亿,所以我无法将所有文件真正推送到内存中并随意删除。

我想到了一些解决方案:

1-要在数据库中创建一个表并将每一行用作唯一键,然后将所有行放入数据库,我们将删除所有重复项。

2-使用Redis Set结构而不是DB。

3-要创建文件,该行作为文件的名称。因此,一旦自然创建了所有文件,重复项就会消失。

然而,我能想到的每个解决方案都需要非常大量的时间和资源,而我目前无法负担。

所以我的问题是:

1-基于上述解决方案,哪条路线似乎更可靠?

2-是否有更好的解决方案/技术我不知道?

1 个答案:

答案 0 :(得分:1)

您需要按子文件拆分每个文件,并使用相等的哈希值,然后比较这些子文件。例如,您只有2个文件,F1和F2,并且您需要删除重复的文件。为此,您需要按照以下算法将每个文件拆分为N个小文件:

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)]);
}

自&#34;第1行&#34;在文件F1和F2中将具有相同的哈希值(例如,56),在拆分期间,它将转到子文件F1.0056和F2.0056。

此后,您可以迭代具有相同编号的每对子文件,并删除重复项。