比较p

2024-10-01 17:34:36 发布

您现在位置:Python中文网/ 问答频道 /正文

问题是:

查找对象键的两个报告之间的差异,这两个报告是彼此的备份


报告分为多个.csv文件:

报告A可以有50个文件,而报告B有20个,尽管两个报告应该包含相同数量的对象键

每个报表中的对象键按字母数字顺序排列

.csv文件的大小不可靠,这就是为什么我们可以看到上面提到的50/20分割

假设文件是有序的:如果报告A中的文件1包含A-c,则文件2将在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%的误报率


Tags: and文件csv数据对象算法move报告

热门问题