什么是海量数据?
正如《逍遥游》中的一句话:北冥有鱼,其名为鲲,鲲之大,一锅炖不下,化而为鸟,其名为鹏,鹏之大,需要两个烧烤架;简单的可以把这里的海量数据理解为这里的鲲鹏 ,数据大到一个服务器存不下,就需要两个甚至多个服务器来存储。而接下来我们需要做的就是用一台服务器来处理海量数据。
以下是一些海量数据处理的例子:
1. 给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP 地址(hash文件切分)
思路:显然100G大小的文件是不可能直接加载到内存中去处理的。所以我们需要对这个文件进行划分,前提是我们需要将相同的IP地址划分到同一空间。假设我们将文件分成1000份,那么一份的大小大概是100M,先将IP地址利用哈希算法求得一个整数key,再将index = key % 1000,得到的结果相同的放到同一文件中,这样就将相同的IP地址放到了同一个文件下。再对每一个文件分别进行处理,用count来记录出现的次数,最后利用排序算法对count进行排序找到最大的那个,即其对应的IP地址为出现次数最多的IP地址。
利用这种方法解决这个问题的关键在于我们在用哈希函数进行哈希切分后相同的IP地址一定会被分到同一个文件中。对于哈希切分,相同的key,得到的哈希值一定相同。
2.给定100亿个整数, 找到其中只出现一次的整数(位图变形, 用两位来表示次数).
首先我们需要知道的是在64位操作系统下,内存大小为8G,那么100亿个数大概需要的空间为40G,显然是不能直接加载到内存中进行处理的,而且在64位操作系统下能表示的整型的个数大概为42亿,所以这100亿个数有三种状态:不存在,存在一次,存在多次。
因此,我们需要对传统的位图进行扩展,使用2bit即可,00表示不存在,01表示存在一次,02表示存在多次,11表示无效状态即可。
3.有两个文件, 分别有100亿个query(查询词, 字符串), 只有1G内存, 找到两个文件的交集(hash文件切分 + 布隆过滤器).
思路:可以先将文件A进行哈希切分,读取每一个query,计算哈希值,例如我们要切分成100份,就可以让hash值%100,如果模的值为0,就把这个query放到布隆过滤器中,这样我们就得到了0号集合;然后遍历文件B,对其中的query进行hash值,再模上100,如果模的值为0,就在布隆过滤器中查找。
依次处理1号集合(hash值%100等于1),2号集合,3号集合……….
备注:布隆的不在是准确的,但在是有误差的。
4. 给上千个文件, 每个文件大小为1K - 100M, 设计算法找到某个词存在在哪些文件中(倒排索引).
首先,把这个词存入一个单项链表中,头结点存储这个词,链表后面存储的都是文件名,然后依次遍历每个
文件,取出文件中的每一个单词并与这个词对比,若找到,就将此文件的文件名添加到后面的链表中,遍历
完所有文件,然后就得到了这个词存在在哪些文件中
来源:CSDN
作者:LiuWang_1122
链接:https://blog.csdn.net/yubujian_l/article/details/79596461