查找两次旨在互为备份的对象密钥报告之间的差异。
报告分为多个.csv文件:
报表A可以有50个文件,报表B可以有20个文件,尽管两个报表应包含相同数量的对象键。
每个报告中的对象键都是字母数字顺序。
.csv文件的大小不可靠,这就是为什么我们可以看到上面提到的50/20分割的原因。
假设文件顺序正确:如果报表A中的file1包含a-c,则file2将在d拾取。
数据示例(其中每个数组代表单个文件,而包含的数组则是整个报表):
report1 = [
[1, 2],
[3, 4, 5, 6],
[7],
[8, 9],
[10],
]
report2 = [
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
]
请记住,这些数据未存储在内存中,我只能访问与每个数组(文件)相关联的文件指针,这些指针可以迭代前向而不是后向。
原始算法是将它们视为两个大列表,并在一个列表结束时更改文件阅读器,然后同时进行迭代以进行比较。假设文件更改已在此处进行。伪代码:
while (not end of report1) and (not end of report2)
if key1 < key2
// key1 missing from report2
move up reader1
else if key2 < key1
// key2 missing from report1
move up reader2
else
// keys match and are in both reports
move up reader1 and reader2
这太慢了。我需要使用数十亿个对象键。
我决定使用相同的比较算法分别并行比较文件:
Report1的第一个文件和Report2的第一个文件与它们的第二个文件同时进行比较,等等。
显然,由于文件大小的差异,这将导致很多假阳性差异,但是在处理结束时,我对所有发现的差异再次运行比较算法。
这使事情加速了很多。但是,在多次处理过程中发现的总差异中有95%是误报,同样是由于这些文件大小的严重不可靠性。还记得50/20分割吗?如果从Report1到达file21,则从Report2没有file21,因此所有这些项都标记为差异。
大多数比较工作不应在最终比较中完成。理想情况下,应在并行过程中完成。
我可以采用哪些方法来并行化这些比较?我想使用尽可能少的内存,并显着减少95%的误报数。