欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Bitmap、BitSet、RoaringBitmap持久化存储

时间:2023-05-02
Bitmap、BitSet持久化存储

​ 关于Bitmap的算法我在这里就不写了,这里主要提供一个持久化存储的思想。BitSet实现了Bitmap,BitSet还有很多方法可以查阅API。

// 创建BitSet对象 BitSet bitSet = new BitSet(10000000); // 将BitSet对象转换为long或byte类型的数组 //就可以将数组存储在Hbase、MongoDB等数据库, long[] longs = bitSet.toLongArray(); byte[] bytes = bitSet.toByteArray();//用的时候再将数据读出来转换为BitSet对象 BitSet bitSet1 = BitSet.valueOf(longs); BitSet bitSet2 = BitSet.valueOf(bytes);

RoaringBitmap

RoaringBitmap适合存储稀疏的数据,是对BitMap算法的优化,RoaringBitmap持久化存储思想一样,代码如下:

RoaringBitmap rbm = new RoaringBitmap();// 序列化为byte数组,就可以保存到数据库了byte[] array = new byte[rbm.serializedSizeInBytes()];rbm.serialize(ByteBuffer.wrap(array));// 使用的时候在反序列化RoaringBitmap rbm2= new RoaringBitmap(); rbm2.deserialize(ByteBuffer.wrap(array));

注意:

如果要将序列化的byte数组转换为字符串,需要指定编码,否则结果会出现问题(反序列化结果会出现问题)。

org.roaringbitmap.InvalidRoaringFormat: I failed to find one of the right cookies、

这个错误,也可以使用以下方法解决。

RoaringBitmap rbm = new RoaringBitmap();// 序列化为byte数组,就可以保存到数据库了byte[] array = new byte[rbm.serializedSizeInBytes()];rbm.serialize(ByteBuffer.wrap(array));//将byte数组转换为字符串 ,字符串就可以通过网络传输了String str = new String(array,StandardCharsets.ISO_8859_1);//将字符串转换为byte数组 byte[] array1 = str.getBytes(StandardCharsets.ISO_8859_1); // 使用的时候在反序列化RoaringBitmap rbm2= new RoaringBitmap(); rbm2.deserialize(ByteBuffer.wrap(array1));

EWAHCompressedBitmap

如果对连续的数据进行排序或存储连续的数据可以使用EWAHCompressedBitmap,这是Google开发的,只要是连续的数据特别特别节省空间。如存1~20亿应该还不到1M。

**注意:**数据小编是存在Hbase上,大家可以根据数据量选择存储系统。使用Hbase存单个较大的BitMap还有一个坑,可以参考博客:
解决Hbase一个cell存储超10M的异常:https://blog.csdn.net/z1987865446/article/details/118771268

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。