目录
本文说明
本来转自这个地址(http://blog.csdn.net/dbt666666/article/details/16974415
)的博文, 不过太差了,遂自己实现一把真正的topK问题,网上的文章只作为本文的参考。因为很早写的,当时在windows上实践的,不过应当实现有点问题,确实也不是真正的TopK求解。鉴于本文截止2020-05-01
的阅读量已经很多了,所以本文标题就不改了;2020-05-01
(今天)重新实践下,并重写本文,并标记本文为原创。
请按照目录阅读,要明白我们的问题,我们怎么求解,我们怎么输出,这里先不考虑大数据方案,就单纯的一个能让大一,大二同学就能直接实践并且能够学到知识
问题
你只有一个2C4G的机器(即内存是有限的)
然后很简单的一个问题: 一个6G的txt文件,每一行都出现了一个IP,要统计这其中出现频次最高的IP,返回出现TopK的IP,输出如下
<topCnt1, Ip1>
<topCnt2, Ip1>
...
<topCntK, IpK>
TopK单机思路(分治)
分治思想应该是容易想到的,如果读大二还不知道,那么赶快去学习
具体实践
步骤 1:每行一个IP:超过内存的大文件
程序模拟产生了一个1G行,每行一个[0,100000]区间的整数
步骤2: 分治求解:
2.1 大文件分成小文件
这里根据IP Hash 到 1024个小文件中,显然有:
在单个文件中,topK的才是最终整体有可能的topK(一个文件中可能出现相同次数的,也要考虑进来);非topK的直接抛弃即可
*注意: 我们是普通的Hash,不过数据还是相对均匀的,所以每个小文件确实是挺小的;考虑现实中数据极端情况,可能出现分治分不了
,业即:大数据常见的数据倾斜问题(这里引入下,不做过多说明)
2.2 小文件统计,并最后统计
对每个小文件,可以用堆,hash,内部排序等等方法进行处理;
2.3 小文件的统计结果 再做一次统计 求出出现频数最高的那个数
步骤3: 程序输出
结果如下: 第一