从10 TB大小的文件中删除重复记录的最佳方法是什么?

时间:2015-04-27 08:52:53

标签: oracle algorithm sorting oracle11g

从10 TB大小的文件中删除重复记录的最佳方法是什么?

具体我正在使用oracle 11g。每个记录由20个varchar(255)(60)等字段,Date或Number组成。大约10%的记录是重复的,重复可以通过10位数的字段识别。 订单没关系,但我很感激,如果你能提一下我的订购情况,我有一个带有4GB RAM的core2dou CPU。

1 个答案:

答案 0 :(得分:1)

这是element distinctness Problem,可以通过以下两种方法解决:

  1. 排序(在您的情况下为外部排序)并迭代:首先对文件进行排序,然后对其进行迭代,所有重复的条目将彼此相邻。
  2. 使用哈希表存储相同的元素。由于哈希表不能适合内存(并且在磁盘上实现它是低效的),你可以在块中执行它,首先将哈希代码在范围[0,a)中的所有条目(和哈希)加载到RAM中,并写入所有唯一的元素到新文件。然后重复范围[a,b)[b,c),......确保范围足以包含该范围内的所有元素。请注意,您可以递归执行此操作(即,使用散列[x,y]编写中间文件,并在此新文件上以递归方式调用以筛选重复项。这使得此方法需要O(nlogn)磁盘访问非常大的文件。 / LI>

    第二种方法的分布式版本是使用map-reduce

    map(file):
       emit(key,'1')
    reduce(key,list):
       emit(key)