海量处理问题的解决方案

1. 给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP 地址(hash文件切分)

解决思路:首先利用哈希进行文件的切分,将100G大小的文件等分成1000份,等分后的每个文件大小为100M。然后利用哈希函数的除留余数法将其分配至对应的编号文件中,利用Hash_map进行频率统计,找出每个文件中出现次数最多的IP,最后利用堆排序,得到这1000个IP中出现次数最多的。


2. 给定100亿个整数, 找到其中只出现一次的整数(位图变形, 用两位来表示次数).

解决思路:采用位图,一个数字用两位来表示次数:00为出现0次;01为出现1次;10为出现多次;11无意义。然后扫描这100亿个整数,查看bitmap中相对应的位。若为00则变01;若为01则变10;若为10则保持不变,以这样的思路来将每个数出现的次数都表示出来。扫描完毕后,查看bitmap,从中找出状态标记为01的整数输出,即只出现过一次。

3. 有两个文件, 分别有100亿个query(查询词, 字符串), 只有1G内存, 找到两个文件的交集(hash文件切分 + 布隆过滤器).

解决思路:和第一题一样,我们可以采用哈希切分来解决这个问题。我们可以将含有100亿个query的文件切分为1000份,这样总共就有2000个文件。然后利用哈希函数的除留余数法,分别完成对文件A和文件B范围分别为A0~A999和B0~B999的映射。然后我们将对应编号相同的文件A、B进行比对,以此找出两文件之间的交集。

4. 给上千个文件, 每个文件大小为1K - 100M, 设计算法找到某个词存在在哪些文件中(倒排索引).                    

解决思路:我们可以用一个文件info来专门保存n个词及其对应的文件信息。先将这n个词利用哈希切分,等分为N份。对每一份都生成一个布隆过滤器,然后把生成的所有布隆过滤器保存在一个文件Bloom_Filter中。将内存分为两块缓冲区,一块用于每次读入一个布隆过滤器,另一块用于读文件。读文件的这个缓冲区的使用相当于有界生产者消费者模型来实现同步。较大的文件可以切分为更小的文件,但需要存储较大文件的标识信息,比如这个小文件是来自哪个大文件的。对读入的每个单词都用内存中的布隆过滤器来判断是否包含某个特定词,若不包含,就从Bloom_Filter文件中读取下一个布隆过滤器至内存,直至包含或遍历完所有的布隆过滤器。如若包含,则更新info文件,直至处理完所有数据。最后将Bloom_Filter文件删除即可。




猜你喜欢

转载自blog.csdn.net/cecilia3333/article/details/80467981