路漫漫其修远兮,吾将上下而求索。想要更快,就要深入挖掘
JAVA
基础的数据结构,从来分析出所编写的
JAVA
代码为什么把内存耗尽,思考有什么办法可以节省内存呢?
啊哈!算法。这里采用了
BitMap
思想。
首先来看一个实验:
指定
VM
参数大小:
-Xms256m -Xmx540m
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
TreeSet set = new TreeSet();
for(long i=10000000000L;i<900000000000L;i++){
set.add(i);
System.out.println("i="+i);
}
}
}
一个简单的
FOR
循环,运行该类,可以看到当输出:
i=10011703526
的时候报错了
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
如果把上面的例子中的
set.add(i);
修改成 set.add(i+"");
那结果又是什么呢?
当输出
i=10005851762
时报了同样的错,内存溢出。为什么往内存里放
Long
型的比
String
型的多了近一半的数据呢?
1024 个字节 =1KB , 1024KB=1MB , 1024MB=1GB
Long
占
8
个字节
(64
位
)
,
11703526
个
Long
型数据约
91433KB
合
89M
String
内部是由
char
构成,一个
char
占
2
个字节,
11
位的数据是
22
个字节,
5851762
个
String
型数据
约合
125721KB
合
122M
11
位的
String
数据比
11
位的
Long
型数据要占内存多。
总结:内存溢出是由于自己没有做到节省内存,用
64
位的
Long
型数据或
176
位的
String
型数据来存储
11
位的数据。那能不能用内存里的
11
位即
11bit
来表示
11
位数据呢?
还是上一章(《
JAVA
海量数据处理之一》)的问题,我还能再快吗?答案是可以的!
我在编码中改用了
BitMap
思想,使效率又提升了一倍。
【什么是Bit-map
】
所谓的Bit-map
就是用一个bit
位来标记某个元素对应的Value
, 而Key
即是该元素。由于采用了Bit
为单位来存储数据,因此在存储空间方面,可以大大节省。
详细资料可参考:
http://blog.csdn.net/hit_kongquan/article/details/6255673
http://wansishuang.appspot.com/?p=35003
例子:用位向量来表示数据:
1
、
3
、
6
、
10
、
100
import java.util.BitSet;
public class BitTest {
public static void main(String[] args) {
// 1 3 6 10 100
BitSet bitSet = new BitSet(100);
bitSet.set(1,true);
bitSet.set(3,true);
bitSet.set(6,true);
bitSet.set(100,true);
for(int i=0;i<bitSet.size();i++){
boolean b = bitSet.get(i);
if(b){
System.out.println(i);
}
}
}
}
用
BitMap
来实现数据过滤结果:
* 371M 的文件( 3000 万的数据) 过滤数据耗时 : 27375 毫秒
* 520M 的文件( 4200 万的数据) 过滤数据耗时 : 62000 毫秒
其中把
4200
万的数据用
BitSet
操作耗时约
20-30
秒,写入目标文件约
30
秒。所以
1
分钟可以搞定
4200
万的数据。效率已经得到了极大的提高。
分享到:
相关推荐
今天小编就为大家分享一篇关于海量数据去重排序bitmap(位图法)在java中实现的两种方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
处理bitmap内存溢出问题
Bitmap-->List
背景分布式一致性 hash 算法将哈希空间组织成一个虚拟的圆环,圆环的大小是,最终会得到一个 [0,] 之间的一个无符号整型,这个整数代表服务器的编号;多个服务
bitmap是一个十分有用的结构。所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 适用范围:可进行数据的快速查找,...
BitMap,BitMapFactory,android 主要为了处理图片,分享下
由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 如果说了这么多还没明白什么是Bit-map,那么我们来看一个具体的例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)...
RoaringBitmap, 在Java中,一个更好的压缩 bitset RoaringBitmap Bitsets,也称为位图,通常用作快速数据结构。 不幸的是,他们可以使用太多的内存。 为了补偿,我们经常使用压缩位图。咆哮位图是压缩位图,它比传统...
加深对bitmap数据结构的理解,bitmap数据位图内存指针数据的长度
android下的图片序列转换为视频,已精简so包,完全由javacv实现从图片或者Bitmap到视频的录制,有完整配置界面,支持录像和暂停以及重启需要导入lib文件夹下的javacv.jar和javacpp.jar两个包.rar,太多无法一一验证...
bitmap 处理
Bitmap位图旋转范例 一个完整工程
JAVA⼤数据处理题 ⼤数据处理题 1. 给定a、b两个⽂件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b⽂件共同的url? ⽅案1:可以估计每个⽂件安的⼤⼩为50G×64=320G,远远⼤于内存限制的4G。...
我们可以用bitmap来解决,bitmap基本思想是一位表示一个整数,比如我们有6个数据: 1 7 3 1 5 6 4 假设bitmap容量为8,当插入7时 bit[7]=1,以此类推 bit[3]=1 bit[1]=1 bit[5]=1 …… bit[4]=1 这样我们查询5,...
很多项目中用到了用户头像,但是系统的ImageView 是四方形的 ,自己写了个处理的方法, 把bitmap处理成圆角的
抓取摄像机视频流一帧的YUV数据,转RGB转bitmap图的类,从现项目中剥离的,保证能用 。
android平台jpeg数据流转换成rgb直接显示的so库 使用方式: byte[] jpegRaw = V4L2Camera.decode(dataBuf, ret); rgb2Buffer(jpegRaw, WIDTH, HEIGHT, rgbBuffer); ByteBuffer jpegBuffer = ByteBuffer.wrap(rgb...
Java 编写的Windows Bitmap编码和解码程序。编码程序没有压缩,支持24位和256色。
java实现的Bitmap类 用于自动生成Bitmap文件头和填充调色板等,目前只支持8位256色的Bitmap