解决大数据问题的思路

文章转载自:https://www.cnblogs.com/CheeseZH/p/5283390.html

大数据问题一般采用分而治之的思想。
首先对数据量大小的单位做一个总结:
1GB=1024MB
1MB=1024KB
1KB=1024Bytes(字节)
1GB= 109 10 9 Bytes

哈希存储
布隆过滤器
归并排序
快速排序
推排序
分布式架构
trie树(字典树)
bit_map(海量数据处理算法)
hash_map
搜索二叉树/红黑树

  • 基本流程就是:将大问题分解为小问题,解决小问题,从局部最优中选取全局最优。
  • 分解过程常用方法:hash(x)%n,其中x为字符串/url/ip,n为小问题的数目,比如把一个大文件分解为1000份,n=1000;
  • top K问题:最大K用最小堆,最小K用最大堆
  • 解决问题辅助数据结构:hash_map,Trie树,bit map,二叉排序树(AVL,SBT,红黑树)

例题:
1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?

每个文件的大小为50亿×64bytes=320G,远远大于内存限制的4G,所以不可能将其完全加载到内存中处理,可以采用分治的思想来解决。

Step1:遍历文件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件(记为a0,a1,…,a999 ,每个小文件约300M);
Step2: 遍历文件b,采取和a相同的方式将url分别存储到1000个小文件(记为b0,b1,…,b999);
巧妙之处:这样处理后,所有可能相同的url都被保存在对应的小文件(a0 vs b0, a1 vs b1 ,…,a999 vs b999)中,不对应的小文件不可能有相同的url。然后我们只要求出这个1000对小文件中相同的url即可。
Step3:求每对小文件ai和bi中相同的url时,可以把ai的url存储到hash_set/hash_map中。然后遍历bi的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。
2. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M,要求返回频数最高的100个词。

Step1:顺序读文件中,对于每个词x,取hash(x)%5000,然后按照该值存到5000个小文件(记为f0 ,f1 ,… ,f4999)中,这样每个文件大概是200k左右;
Step2:对每个小文件,统计每个文件中出现的词以及相应的频率(可以采用trie树/hash_map等),并取出出现频率最大的100个词(可以用含100个结点的最小堆),并把100词及相应的频率存入文件,这样又得到了5000个文件;
Step3:把这5000个文件进行归并(类似与归并排序);

你可能感兴趣的:(数据分析)