如何检测大文件(TB)中的少量更改

时间:2014-08-30 08:49:30

标签: algorithm bigdata

我刚刚发现一个有趣的博客,谈论一些面试问题。其中一个问题是:

  

给定一个非常大的文件(多个TB),检测连续运行程序之间文件中4MB范围的变化。

我对此没有任何线索。任何人都可以对此提出一些想法吗?

2 个答案:

答案 0 :(得分:4)

如果您对数据创建有任何控制权,可以使用 Merkle trees

将数据拆分成小片段(假设每个10MB,但这不是问题),并为每个片段创建一个h=hash(fragment)

现在,所有这些哈希都将成为树的叶子。现在,从叶子中创建一个完整的二叉树:h(father) = hash(father.left XOR father.right)
现在,你已经拥有了一棵树 - 如果比较两棵树,h(root1)= h(root2)当且仅当tree1 = tree2时 - 概率很高(如果使用128位散列,错误的概率是1/2 ^ 128,这实际上可以忽略不计。)

同样的声明对于任何子树当然都是正确的,这使您可以快速找到不同的叶子,并且此叶子代表更改的片段。

Amazon's Dynamo使用这个想法来比较两个数据库是否已更改,并快速找到更改。

答案 1 :(得分:0)

您可以逐字节比较并找出差异。这需要很长时间,但值得一试。

我想到的另一个解决方案是将文件拆分为500 GB并计算md5值并将其与拆分的原始md5值进行比较。一个与原始版本不同,你可以将它分成250 gb并再次比较原始的md5值。而你进一步做到这一点直到你得到4 MB。

类似于具有有限匝数的称重机的硬币问题。