并行比较两个拆分的数据列表

时间:2019-06-26 19:03:57

标签: python multithreading parallel-processing multiprocessing python-multithreading

问题如上所述:

查找两次旨在互为备份的对象密钥报告之间的差异。


报告分为多个.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%的误报数。

0 个答案:

没有答案