| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 十亿数据量 判断元素是否存在 -> 正文阅读 |
|
[大数据]十亿数据量 判断元素是否存在 |
核心是采用:bitMap 假设一个场景,要存0-7之内的数字[3,5,6,1,2],尽量的节省空间。
使用redis的set集合存储,但若是数据量放大到十亿级别,集合的所占用的内存会很是大。并且,redis单个实例最大为2.5亿。 另外一种思路是使用BitMap: 表示[3,5,7,1,2],咱们能够用8bit的空间来存储,每一个数字都在对应的位置中以1的方式表示
这样,相当于每一位只存储了一个字符,只需要知道该下标是否为1,即可。 这里是不是就会发现,存储的数据必须为正整数,才可以使用bitMap进行存储。 所以我们需要做的就是,把数据转换成:正整数。 我们采用google开源的cityhash算法,先将string转换为32位整数,然后构建512MB的bitmap存储这些整数。 为什么是32位呢,因为redis实现了bitMap算法,可以从用redis的setBit进行数据存储。但是因为redis官方规定:setting bit number 2^32 -1;也就是说,存储的正整数必须小于32位。 有一个很好的工具类hutool,实现了cityhash算法,直接引用:
?但是由于,HashUtil.cityHash32返回的是int,是一个整数,redis的bitMap仅支持正整数,存在差异性,所以我不会了。最好存进去的数就是一个32位正整数。 还有一个办法就是下面这个:不要使用redis的bitMap RoaringBitmap 和 Roaring64Bitmap 32位以下数据直接使用?RoaringBitmap;(包含负数) 64位以下数据直接使用?Roaring64Bitmap;(包含负数) 使用hutool工具,转换成64位的整数,Roaring64Bitmap直接支持Long类型。
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/16 3:47:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |