我有一组文件。每个文件应包含所有文件中的一组唯一行。例如,如果File i包含“Line 1”行,那么其他文件不应该有“Line 1”行(同时文件i应该包含1行“Line 1”)
问题:
我需要从这些文件中删除所有重复项。然而,总行数超过数十亿,所以我无法将所有文件真正推送到内存中并随意删除。
我想到了一些解决方案:
1-要在数据库中创建一个表并将每一行用作唯一键,然后将所有行放入数据库,我们将删除所有重复项。
2-使用Redis Set结构而不是DB。
3-要创建文件,该行作为文件的名称。因此,一旦自然创建了所有文件,重复项就会消失。
然而,我能想到的每个解决方案都需要非常大量的时间和资源,而我目前无法负担。
所以我的问题是:
1-基于上述解决方案,哪条路线似乎更可靠?
2-是否有更好的解决方案/技术我不知道?
答案 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。
此后,您可以迭代具有相同编号的每对子文件,并删除重复项。