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

本文探讨了海量数据处理中的哈希分治方法,通过哈希映射和hash_map统计解决大规模文件中IP地址频率TOP10的问题。在内存限制下,将大文件拆分为小文件,利用哈希函数分配数据,然后对每个小文件统计IP地址频率,最终排序得到TOP10。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    海量数据处理有很多种方法,如哈希分治、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))

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值