Java中利用BitMap位图实现海量级数据去重

这篇具有很好参考价值的文章主要介绍了Java中利用BitMap位图实现海量级数据去重。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java中利用BitMap位图实现海量级数据去重,Java全栈,java,开发语言

🏷️个人主页:牵着猫散步的鼠鼠 

🏷️系列专栏:Java全栈-专栏

🏷️个人学习笔记,若有缺误,欢迎评论区指正

Java中利用BitMap位图实现海量级数据去重,Java全栈,java,开发语言

目录

前言

什么是BitMap?有什么用?

基本概念

位图的优势

位图的劣势

BitMap和Int的区别

使用场景

BitMap在Java中的使用


1.前言

有许多方法可以用来去重,比如使用列表、集合等等,但这些方法通常只适用于一般情况。然而,当涉及到大量数据去重时,常见的 Java Set、List,甚至是 Java 8 的新特性 Stream 流等方式就显得不太合适了。在处理大量数据的需求场景下,我们不得不提及 BitMap。

2.什么是BitMap?有什么用?

2.1.基本概念

位图(BitMap),基本思想就是用一个bit来标记元素,bit是计算机中最小的单位,也就是我们常说的计算机中的0和1,这种就是用一个位来表示的。

所谓位图,其实就是一个bit数组,即每一个位置都是一个bit,其中的取值可以是0或者1

Java中利用BitMap位图实现海量级数据去重,Java全栈,java,开发语言

像上面的这个位图,可以用来表示1,4,6:

Java中利用BitMap位图实现海量级数据去重,Java全栈,java,开发语言

如果不用位图的话,我们想要记录1,4,,6 这三个整型的话,就需要用三个unsigned int,已知每个unsigned int占4个字节,那么就是3_4 = 12个字节,一个字节有8 bit,那么就是 12_8 = 96 个bit。

所以,位图最大的好处就是节省空间。

位图有很多种用途,特别适合用在去重、排序等场景中,著名的布隆过滤器就是基于位图实现的。

2.2.位图的优势

  1. 空间效率优势:极大的节省了存储空间,对于大量稀疏数据,特别是当元素数量远大于实际存在的项时,相比较于使用传统的列表、集合等数据结构,位图的空间占用极小。
  2. 查询速度:由于内存访问时按字节或字进行的。因此对单个元素的存在性检查时间复杂度为O(1),即常量时间,非常快速。
  3. 批量操作高效:对于批量插入、删除和查询操作,尤其是统计范围内元素的数量,位图表现出优秀的性能。

2.3.位图的劣势

但是位图也有着一定的限制,那就是他只能表示0和1,无法存储其他的数字。所以他只适合这种能表示true or false的场景。

3.BitMap和Int的区别

以Java中的int为例,来对比观察BitMap的优势,再Java中,int类型通常需要32位,而BitMap使用1位就可以来标识此元素是否存在,所以可以认为BitMap占用的空间大小只有int类型的1/32,所以有大量数据判重时,使用BitMap也可以实现。

了解了什么是BitMap,那么我们就可以使用BitMap来解决大量数据去重的问题

4.使用场景

假设我们有40亿个无符号整数数据,并且都是10位的话,如果直接使用内存来存储,大约需要14.9GB 的空间。

每个无符号整数通常占用4个字节(32位),因此40亿个无符号整数所需要的总字节数位4*4000000000字节。 总字节数转换为GB:4*4000000000 / 1024 / 1024 /1024 = 14.9 GB

考虑到其中有一些重复的数据,即使这样1G的空间基本上也是不够的。所以想要实现这个功能可以借助BitMap。

如果使用位图的话,40亿万所需要的内存大概也就是 476M

40亿无符号整数数据的总字节数是4000000000 字节,在位图中1个10位的无符号整数可以使用1 bit表示,然后1 字节 = 8 位(bit)。 4000000000 bit * 1/8 求出字节数,再 / 1024得到占用的KB数,最后/ 1024得到占用的MB数 4000000000 * 1 /8 /1024/1024 = 476M

这样相比于之前的14.9G来说,大大的节省了很多空间。

比如要把数据"714771310"放到BitMap中,就需要找到第714771310这个位置,然后把他设置成1就可以了。

Java中利用BitMap位图实现海量级数据去重,Java全栈,java,开发语言

这样,把40亿个数字都放到BitMap之后,所有位置上是1的表示存在,不为1的表示不存在,相同的数据只需要设置一次1就可以了,那么,最终就把所有是1的数字遍历出来就行了。

5.BitMap在Java中的使用

BitMap在Java中的具体实现时java.util中的BitSet,BitSet是一个可变大小的位向量,能够动态增长以容纳更多的数据,以下是BitSet基本使用示例:

import java.util.BitSet;

public class BitmapExample {
    public static void main(String[] args) {
        // 创建一个BitSet实例
        BitSet bitmap = new BitSet();

        // 设置第5个位置为1,表示第5个元素存在
        bitmap.set(5);

        // 检查第5个位置是否已设置
        boolean exists = bitmap.get(5);
        System.out.println("Element at position 5 exists: " + exists);  // 输出: Element at position 5 exists: true

        // 设置从索引10到20的所有位置为1
        bitmap.set(10, 21);  // 参数是包含起始点和不包含终点的区间

        // 计算bitset中所有值为1的位的数量,相当于计算设置了的元素个数
        int count = bitmap.cardinality();
        System.out.println("Number of set bits: " + count);

        // 清除第5个位置
        bitmap.clear(5);

        // 判断位图是否为空
        boolean isEmpty = bitmap.isEmpty();
        System.out.println("Is the bitset empty after clearing some bits? " + isEmpty);
    }
}

6.总结 

本文简单的讲解了如何使用BitMap进行大量数据的去重,BitMap的空间占用极小,对单个元素的存在性检查时间复杂度为O(1),非常快速,除了BitMap外,我们也可以采取布隆过滤器来完成去重,但是布隆过滤器存在误判问题,可以根据实际场景来分析使用哪种方案

Java中利用BitMap位图实现海量级数据去重,Java全栈,java,开发语言文章来源地址https://www.toymoban.com/news/detail-846494.html

到了这里,关于Java中利用BitMap位图实现海量级数据去重的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++【位图/布隆过滤器—海量数据处理】

    先看下面的一道题 : 1.有40亿个不重复的无符号整数,无序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 如果我们放到哈希表或红黑树中或用排序和二分查找这两种方法。 前两种方法不可行,因为40亿个整数占用大约16G的内存空间,第一要排序需要先把数

    2024年02月09日
    浏览(62)
  • 数据结构:位图、布隆过滤器以及海量数据面试题

    1.1概念 引入 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 (1)遍历: 时间复杂度O(N) (2)排序加二分:时间复杂度O(N*logN) 其中 方法(2)是行不通 的,因为内存很难装下这么多数据(40亿整数大概为16G)。 方法(1) 可行

    2024年02月05日
    浏览(42)
  • 【C++】位图|布隆过滤器|海量数据处理面试题

    所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在。 首先我们来看一道题目: 给定40亿个不重复的无符号整数,没有进行排序。现在给一个无符号整形,如何快速判断一个数是否存在这40亿个数中。 现在有三种

    2024年02月13日
    浏览(45)
  • 【C++】海量数据处理面试题(位图和布隆过滤器)

    都是大厂面试题哦~ 文章目录 一.位图面试题     1. 给定 100 亿个整数,设计算法找到只出现一次的整数     2.给两个文件,分别有 100 亿个整数,我们只有 1G 内存,如何找到两个文件交集?     3. 1 个文件有 100 亿个 int , 1G 内存,设计算法找到出现次数不超过 2 次的所有整

    2024年02月07日
    浏览(55)
  • 哈希思想应用【C++】(位图,布隆过滤器,海量数据处理面试题)

       目录 一,位图 1. 位图概念 2.实现 3. 测试题 位图的优缺点 二,布隆过滤器 1). 布隆过滤器提出 2). 概念 3). 布隆过滤器的查找 4). 布隆过滤器删除(了解) 5). 布隆过滤器优点 6). 布隆过滤器缺陷 三,海量数据面试题 1)哈希切割 我们首先由一道面试题来理解位图 给40亿个不

    2024年02月04日
    浏览(44)
  • 大数据-玩转数据-Flink 海量数据实时去重

    大数据|阿里实时计算|Flink 借助redis的Set,需要频繁连接Redis,如果数据量过大, 对redis的内存也是一种压力;使用Flink的MapState,如果数据量过大, 状态后端最好选择 RocksDBStateBackend; 使用布隆过滤器,布隆过滤器可以大大减少存储的数据的数据量。 如果想判断一个元素是不

    2024年02月07日
    浏览(36)
  • Roaring BitMap(高效压缩位图)

    BitMap的问题在于,不管业务中实际的元素基数有多少,它占用的内存空间都恒定不变。 如果BitMap中的位的取值范围是1到100亿之间,那么BitMap就会开辟出100亿Bit的存储空间。 但是如果实际上值只有100个的话,100亿Bit的存储空间只有100Bit为1,其余全部为0,数据存储空间浪费严

    2024年02月03日
    浏览(34)
  • Redis教程——Redis bitmap位图操作(图解)

    在平时开发过程中,经常会有一些 bool 类型数据需要存取。比如记录用户一年内签到的次数,签了是 1,没签是 0。如果使用 key-value 来存储,那么每个用户都要记录 365 次,当用户成百上亿时,需要的存储空间将非常巨大。为了解决这个问题,Redis 提供了位图结构。 位图(

    2024年01月21日
    浏览(37)
  • zxing二维码位矩阵转换成Bitmap位图

    ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码。 该项目可实现的条形码编码和解码。我们支持以下格式: UPC-A,UPC-E EAN-8,EAN-13 39码 93码 代码128 创新及科

    2023年04月11日
    浏览(49)
  • NKCorpus:利用海量网络数据构建大型高质量中文数据集

    摘要 【目的】 大规模、高质量的中文数据集对于大型中文预训练语言模型及其他自然语言处理模型的训练至关重要,因此需要设计并完善一种可以构建大规模中文数据集的框架。 【方法】 利用语言提取、文本清洗、数据去重等多种方法对原始数据进行处理获取数据集,并利用

    2024年02月06日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包