海量数据处理

给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?

思路:首先100G大小的文件,计算机内存无法存储,所以我们解决问题首先不能考虑把文件放在内存中在去遍历统计次数。但是我们可以数据结构中的哈希表来处理。
1)切割文件:将100G的大文件文件分割为1000份(分多少份取决你处理文件的大小)。

2)计算ip的位置:ip是字符串,我们通过字符串哈希函数可以计算出每个IP对应的index(index = Hashfunc(ip)%1000)。

3)统计ip出现的次数:利用key (ip)—value(ip出现的次数)模型去统计每个ip出现的次数。

4)找出次数最多的ip:遍历每个小文件,找出最大的value值,即为出现做多的次数。

图解过程如下:
哈希切割

给定100亿个整数,设计算法找到只出现一次的整数

思路:整数是4个字节,100亿个整数所占内存大约是40G,所以无法直接对100亿个整数进行统计。有个数据结构叫位图(哈希表的变形),利用他便可以解决这个问题。
当然这里必须对位图进行处理,如果映射到该位置为0,则将该位置置1,如果映射到该位置为1,则置0。最后比特位为1的数,即为出现一次的数。
当然此题也可以用哈希表解决,思路与上题相同。

位图节省空间,哈希表则会花费大量空间。

给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集

思路:这道题也是不能直接操作,必须借助位图来处理。(100亿整数估算要花费40G,题目给出的内存是1G)。
利用位图可以只需要开辟整数的最大范围个比特位(大约是500M)。

1)将一个文件中所有整数映射到位图。

2)遍历第二个文件再次映射到位图,如果映射位置为1则置0,映射位置为0则置1,最后取反。取反后为1的位置既是两个文件交际。

1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数

思路:同样利用位图,这里要对位图做处理,用两个位图进行计数,00出现0次,01出现一次,10出现两次,大于两次用11记录。
1)映射所有整数到位图。

2)遍历位图,出现01则为需要找的整数。

给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法

思路:假设每个query为10个字节,100亿个query则为100 * 10 个字节。估算需要100G内存,两个文件需要200G内存,题目只有1G内存。
近似算法用布隆过滤器,步骤与上题求交集方法一样。
精确算法:
估算:100亿个字节大约需要10G的内存,假设每个query所占10个Bite,100亿个query就需要100G的内存,显然计算机是存不下的
这里找交集,我们可以考虑使用哈希分割,具体做法如下:
1)将两个文件分别分成1000份的小文件,将问题转化为求这两个小文件划分出来的每个小文件的交集
2)将每个小文件的交集求出,整合成两个文件的交集

如何扩展BloomFilter使得它支持删除元素的操作 如何扩展BloomFilter使得它支持计数操作

基本的布隆过滤器不支持删除(Deletion)操作,但是 Counting filters 提供了一种可以不用重新构建布隆过滤器但却支持元素删除操作的方法。在Counting filters中原来的位数组中的每一位由 bit 扩展为 n-bit 计数器,实际上,基本的布隆过滤器可以看作是只有一位的计数器的Counting filters。原来的插入操作也被扩展为把 n-bit 的位计数器加1,查找操作即检查位数组非零即可,而删除操作定义为把位数组的相应位减1,但是该方法也有位的算术溢出问题,即某一位在多次删除操作后可能变成负值,所以位数组大小 m 需要充分大。另外一个问题是Counting filters不具备伸缩性,由于Counting filters不能扩展,所以需要保存的最大的元素个数需要提前知道。否则一旦插入的元素个数超过了位数组的容量,false positive的发生概率将会急剧增加。当然也有人提出了一种基于 D-left Hash 方法实现支持删除操作的布隆过滤器,同时空间效率也比Counting filters高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙跃十二

写的不错,给点鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值