海量数据处理方法归纳

问题

场景1:10亿个正整数,给定一个数值,如何快速判定该数值是否在10亿个正整数当中?假如机器只有1G内存?一个整数4个字节,10亿个正整数,40亿个字节~4G内存,而机器的内存只有1G

场景2:10亿个正整数,快速排序,假如机器只有1G内存?

方法0、mysql

将数据存到mysql中,如果并且为该列设置索引,如果可以从表中select到,就可以判定数值在其中

方法1:分布式集合/分布式哈希

如果有很多机器,但是每个机器的上线是 1G的内存的话,可以考虑采用redis的set
10台机器,每台机器1G,将10亿个整数分成4份加载到4台机器中(分别通过redis存入缓存sadd(set.add))

方法2:多路归并排序

整体流程

1、将10亿数据分成4组,每组1G数据,先对每组数据进行快排/归并排序
2、再将排序后的4组数据,各拿0.25G数据出来,进行归并,一组的0.25数据处理完,补充该组的下一个0.25

手撕归并排序

方法3:桶排序

整体思路

1、依次遍历整数,按照其大小分到n个桶中,(如果存在数据量很大的桶,将桶再分割为更小的桶)
2、将n个桶中的数据进行快排
3、再将排序后的数据,分桶输出即可

手撕桶排序

方法4:BitMap

什么是bitmap

本来一个int类型的数据,占4个字节,32个位,如果用位来表示的话,一个int只需要占对应下表的一个位即可
10亿个整数,用int表示:约4G数据
如果最大值是10亿,用位图表示:4/32G数据,那么1G内存就可以直接处理

整体思路

1、用java写bitmap结构或者直接使用redis中的bitmap结构
2、直接将全部的输入到bitmap中
3、判断bitmap中是否有给定的数值

手撕bitmap

方法5:布隆过滤器

什么是布隆过滤器

由一个位图和多个无偏hash函数组成

整体思路

1、如果判断存在时允许有一定的误差可以考虑布隆过滤器
2、使用redis的布隆过滤器添加全部输入
3、通过布隆过滤器判断给定数值是否不存在

手撕布隆过滤器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值