海量数据处理(一)哈希分治

    海量数据处理有很多种方法,如哈希分治、simhash、外排序、多层划分等。本文将讨论哈希分治

 

    哈希分治的核心是hash_map,hash_map和map类似,不过hash_map能够创造出对象而map不能。对内存中查找数据,hash_map比较适合在内存中查找。当然,这不是重点。

 

    一个很典型的题:如果有两个500G的文件,里面放着若干IP地址,要求查找出出现频率TOP10,而给定内存为1G。该怎么处理。

 

很明显,我们不可能将文件加载到内存里。所以,对于这种海量数据处理,我们需要使用hash_map类的查找方法。

第一步:哈希映射。

    分而治之的思想,两个500G的文件合起来是1000G,给的内存为1G,那么我就创建1000个小文件,通过哈希函数hash(x)00,将两个大文件里的数据全部分到这1000个小文件里,如果hash函数不够好造成冲突,导致某个文件超过了1G,那么我们可以用线性探测法的思路往下分,直到每个所获得的文件大小都不超过1M。

第二部:hash_map统计

    对每个小文件,使用hash_map或者T树等方法统计每个文件中出现的IP地址以及频率,对频率排序,写入一个新的小文件里。并删除原先的小文件。这样将产生新的1000个小文件并删除旧的1000个小文件。

第三步:对新的1000个小文件进行排序,并将TOP10写入一个新的文件里,并删除旧的1000个小文件。

 

 

难度降低,如果给100W个数,或1000W(能够加载到内存),要求TOP10。

方法1:堆排序,创立含100个元素的最小堆(时间复杂O(n*logn))

方法2:插排,选前10个数并排序,之后插排,直到遍历所有元素(时间复杂O(n*10))

海量数据处理有很多种方法,如哈希分治、simhash、外排序、多层划分等。本文将讨论哈希分治

    哈希分治的核心是hash_map,hash_map和map类似,不过hash_map能够创造出对象而map不能。对内存中查找数据,hash_map比较适合在内存中查找。当然,这不是重点。

一个很典型的题:如果有两个500G的文件,里面放着若干IP地址,要求查找出出现频率TOP10,而给定内存为1G。该怎么处理。

    很明显,我们不可能将文件加载到内存里。所以,对于这种海量数据处理,我们需要使用hash_map类的查找方法。
    第一步:哈希映射。
    分而治之的思想,两个500G的文件合起来是1000G,给的内存为1G,那么我就创建1000个小文件,通过哈希函数hash(x)00,将两个大文件里的数据全部分到这1000个小文件里,如果hash函数不够好造成冲突,导致某个文件超过了1G,那么我们可以用线性探测法的思路往下分,直到每个所获得的文件大小都不超过1M。
    第二部:hash_map统计
    对每个小文件,使用hash_map或者T树等方法统计每个文件中出现的IP地址以及频率,对频率排序,写入一个新的小文件里。并删除原先的小文件。这样将产生新的1000个小文件并删除旧的1000个小文件。
    第三步:对新的1000个小文件进行排序,并将TOP10写入一个新的文件里,并删除旧的1000个小文件。


难度降低,如果给100W个数,或1000W(能够加载到内存),要求TOP10。
方法1:堆排序,创立含100个元素的最小堆(时间复杂O(n*logn))
方法2:插排,选前10个数并排序,之后插排,直到遍历所有元素(时间复杂O(n*10))

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章