从大文件中查找唯一值

时间:2013-05-16 21:49:17

标签: c algorithm memory-management hash bigdata

我有一个大文件(比如10TB)和MD5哈希流(包含重复项),我有一个10MB(非常有限)的内存和无限的硬盘空间。使用给定条件查找所有唯一哈希(消除重复)。请帮忙,这显然不是一个功课问题

3 个答案:

答案 0 :(得分:8)

您可以使用外部排序算法(例如使用polyphase merge sort)对哈希值进行排序,之后您只需要遍历文件并跳过与最新哈希值相等的任何哈希值

hash mostRecentHash;
while(fileHasHashes) {
    temp = fileWithDuplicates.readHash();
    if(!hashesAreEqual(mostRecentHash, temp)) {
        mostRecentHash = temp;
        fileWithoutDuplicates.writeHash(mostRecentHash);
    }
}

答案 1 :(得分:3)

如果性能无关紧要,并且您的文件系统没有限制,那么您只需为每个哈希创建一个文件。如果在创建过程中遇到EEXIST,则会出现重复,可以跳过它。

for (each hash) {
    r = open(hash_to_filename(hash), O_CREAT|O_EXCL);
    if (r < 0) {
        if (errno == EEXIST) continue;
        perror(hash);
        exit(EXIT_FAILURE);
    }
    close(r);
    output(hash);
}

这样做的好处是它保留了流中首次出现的哈希值的顺序。

此解决方案的实际性能取决于文件系统的性能。如果文件是在B树中组织的,那么性能将大致为O(N log(N))。如果文件系统使用哈希表来组织文件,那么性能应该是O(N),但它取决于冲突发生的频率(并且由于磁盘访问,常数因子很高)。 p>

答案 2 :(得分:0)

我喜欢Zim-Zam的解决方案......提出一个小变化。

如果我们可以假设指纹在128位空间上均匀分布,那么 我们可以使用像Bucket sort这样的东西将指纹桶化到(较小的)桶文件中,单独对存储桶文件进行排序,然后使用堆将存储桶文件合并到一个已排序的文件中吗?这可能会降低nlogn成本。