整理自网络
1、大数据量排序,重复次数最高10条数据
原出处:
重复次数最高的10条数据
有10个G的数据。如果两条数据一样,则表示该两条数据重复了,现在给你512M的内存,把这10G中重复次数最高的10条数据取出来。
分析:10G是数据整型,那实际放到内存中占用不了这么多,会略小点,内存中用4B INT保存,而文本中用每个字符就是1B。但还是得考虑切分数据。
解决:
通用方法A:
1. 先排序, 10G数据分成40份,每份256M,排序,合并相同数据并加上计数器,写到临时文件chunk01~chunk20。
2. 对每一chunk, 读入内存,对每一条数据,再依次读入其后续个chunk, 合并相同数据的计数,后写入一个文件count。为了避免重复计数,在计数累加后需要将原来chunk的计数清零并回写文件。
以chunk01为例。假设chunk01中有数据A-8(数据A, 8次),chunk02中有A-2,那么合并chunk02后
chunk01的内存中为A-10, chunk02中为A-0,这时把chunk02写回文件,然后读入chunk03继续处理处理。最后把chunk01中计数不为0的数据(chunk01里不会有计数为0的,但是后面的chunk会有)写入文件count.
3. 对count文件进行按重复次数排序。(分组,排序,然后每组选前10,再排序)
方法2:
如果知道数据范围,并且范围不太,数据重复率也较高。可直接利用数组Hash的方式来统计出现次数。如数据范围在多少万内,可用一个 int tem[MAX_INT]来统计,所需内存为 MAX_INT * 4 B。
MAX_INT * 4B = 2^32 * 4B = 16GB
待完成 :
大数据排序之TopK问题
怎么在海量数据中找出重复次数最多的一个