从 10 TB 大小的文件中删除重复记录的最佳方法是什么?
what is the best way to removing duplicate records from a file of 10 terabyte size?
从 10 TB 大小的文件中删除重复记录的最佳方法是什么?
具体来说,我使用的是 oracle 11g。每条记录由 varchar(255)(60)etc 、Date 或 Number 等 20 个字段组成。大约 10% 的记录是重复的,重复可以通过 10 位数字的字段来识别。
顺序无关紧要,但如果您能提及我在订购时应该怎么做,我将不胜感激,我有一个带有 4gb RAM 的 core2dou CPU。
这是element distinctness Problem,可以通过以下两种方法解决:
- 排序(在您的情况下为外部排序)并迭代:首先对您的文件进行排序,然后对其进行迭代,所有重复的条目将彼此相邻。
- 使用散列table来存储相同的元素。由于哈希 table 无法放入内存(并且在磁盘上实现它效率低下),您可以分块进行,首先将哈希代码在
[0,a)
范围内的所有条目(和哈希)加载到 RAM 中, 并将所有唯一元素写入新文件。然后对范围 [a,b)
、[b,c)
、……重复。确保范围足以包含该范围内的所有元素。请注意,您可以递归地执行此操作(即用哈希 [x,y]
编写一个中间文件,然后递归地调用这个新文件以筛选重复项。这使得这种方法需要 O(nlogn)
磁盘访问非常大的文件。
第二种方法的分布式版本是使用map-reduce:
map(file):
emit(key,'1')
reduce(key,list):
emit(key)
从 10 TB 大小的文件中删除重复记录的最佳方法是什么?
具体来说,我使用的是 oracle 11g。每条记录由 varchar(255)(60)etc 、Date 或 Number 等 20 个字段组成。大约 10% 的记录是重复的,重复可以通过 10 位数字的字段来识别。 顺序无关紧要,但如果您能提及我在订购时应该怎么做,我将不胜感激,我有一个带有 4gb RAM 的 core2dou CPU。
这是element distinctness Problem,可以通过以下两种方法解决:
- 排序(在您的情况下为外部排序)并迭代:首先对您的文件进行排序,然后对其进行迭代,所有重复的条目将彼此相邻。
- 使用散列table来存储相同的元素。由于哈希 table 无法放入内存(并且在磁盘上实现它效率低下),您可以分块进行,首先将哈希代码在
[0,a)
范围内的所有条目(和哈希)加载到 RAM 中, 并将所有唯一元素写入新文件。然后对范围[a,b)
、[b,c)
、……重复。确保范围足以包含该范围内的所有元素。请注意,您可以递归地执行此操作(即用哈希[x,y]
编写一个中间文件,然后递归地调用这个新文件以筛选重复项。这使得这种方法需要O(nlogn)
磁盘访问非常大的文件。
第二种方法的分布式版本是使用map-reduce:
map(file):
emit(key,'1')
reduce(key,list):
emit(key)