您的方案的一个问题是任何重复的行都会有重复的哈希;您永远无法确定何时添加或删除了这些行之一
非常好,但不是问题。重复的行是重复的,所有重复的都在下一个处理阶段被删除。所以是的,你是对的,但这不是问题。
“差异”链接将我带到一个页面,其中描述了我认为是应用程序的内容?
没有下载链接,没有任何语言的代码......我在这里错过了什么?
你们中的一些人谈到了字节级粒度。这不是必需的。只需要行级别的粒度,因为如果行中的任何内容发生了更改,则必须重新处理整行(记录),因为行内的任何更改都会影响整行。
所以我们在两个文件(今天的快照和昨天的快照)中比较了大约 1000 个字符的行(没有二进制),每个文件大约 1m 行。
因此,使用 SHA256 之类的安全哈希(MD5 有冲突,相比之下速度较慢)我可以在我的 HO 笔记本电脑上处理大约 30MB/秒。服务器当然会更快地处理它。
因此,如果文件是 1GB 左右,那么制作所有的 hases 大约需要 33 秒,而使用 Windows 页面内存读取 1Gb 文件大约需要 30 秒。不可怕
现在我们有两个散列数组,表示每个文件中的行。
如果我们对它们进行排序,我们现在可以使用二进制搜索,因此我们遍历新文件哈希以寻找旧文件哈希中的匹配项。如果我们没有找到它,该行将添加到更改文件中。
请记住,行书(遗留数据库)在各个方面都是未知的。无法保证行的顺序、更改的位置、更改的类型。
逐页阅读前文的建议是好的,但假设两个文件在第一次更改之前都是smae顺序。这是不能假设的。行(行)可以是任何顺序。选择任意块大小也违反了行的粒度。就本任务而言,行是不可变的。
从关于 invrementa 加载的优秀链接:
文件比较捕获:此方法也称为快照差异方法。此方法通过保留与数据仓库相关的文件的前后图像来工作。比较记录以查找更改,比较记录键以查找插入和删除。由于触发器通常不存在并且事务日志不存在或采用专有格式,因此该技术最适合遗留系统的情况。由于大多数遗留数据库都有一些将数据转储到文件中的机制,因此该技术会创建定期快照,然后比较结果以生成更改记录。当然,静态捕获的所有问题都存在于此。比较整行信息以及密钥识别和匹配的挑战引入了额外的复杂性。这种技术本质上很复杂,通常不受欢迎,但在某些情况下,可能是唯一的解决方案。
这是最相关的:
随着我们进入 TB 级数据仓库领域,每晚从头开始重建数据仓库的能力将成为恐龙时代的产物。更新数据仓库的合乎逻辑且有效的方法涉及某种形式的增量更新策略。
那么我想我是在正确的轨道上? btree 索引没有优势吗?