路漫漫其修远兮,吾将上下而求索。想要更快,就要深入挖掘
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
万的数据。效率已经得到了极大的提高。
分享到:
相关推荐
Java大数据处理技术主要涉及到如何高效地处理海量数据,尤其是在内存受限的情况下。以下是对给定问题的详细解答: 1. 共享URL查找: - 方案1:采用分治策略,将大文件按哈希值分散到多个小文件中,然后两两比较小...
由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 如果说了这么多还没明白什么是Bit-map,那么我们来看一个具体的例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)...
《Java面试必知必会》一书中,针对海量数据处理的部分涵盖了多个重要知识点,这些都是Java开发者在求职面试中经常遇到的问题。以下是对这些知识点的详细解释: 1. **基础知识** - **Bit与Byte**:计算机中最基本的...
海量数据处理主要涉及两个方面,一是海量数据带来的挑战,二是解决这些挑战的方法。所谓海量数据,是指数据量庞大到无法在短时间内迅速解决,或者无法一次性装入内存中。对于这种数据处理,一个重要的解决思路是采用...
随着互联网技术的发展,大量的在线服务需要处理海量数据。特别是在社交媒体、在线教育等领域,如何高效地管理和统计用户的行为数据变得尤为重要。其中,“签到”作为一项常见且重要的用户行为,其统计与管理直接影响...
大数据处理算法在现代信息技术领域扮演着至关重要的角色,尤其是在面对海量数据时,高效的处理策略能够极大地提升数据分析的速度和准确性。本篇主要讨论三种大数据处理算法:Bitmap算法、Bloom Filter算法以及...
### 物联网数据处理存储技术资源 #### 一、数据存储技术 **1. 分布式文件系统** - **HDFS(Hadoop Distributed File System)**:这是一种由Java语言开发实现的分布式文件系统,是Google云计算的核心技术之一。...
在大数据处理领域,面对海量数据的挑战,常常需要设计高效的算法和数据结构来解决实际问题。以下是基于给定的面试题解析的一些关键知识点: 1. **分治策略**: - 在第一题中,处理两个大文件(各50亿url)的共同...
在这个场景中,我们有海量日志数据,问题是如何提取出某日访问百度次数最多的那个 IP? 解决方案 1:首先是这一天,并且是访问百度的日志中的 IP 取出来,逐个写入到一个大文件中,然后采用映射的方法,找出每个小...
在处理海量数据时,传统的线性搜索效率低下,而位图查询利用位运算的特性,可以在几乎常数时间内完成查找操作,尤其适用于数据范围较小的情况。下面将详细解释这一技术及其应用。 位图(Bitmap)是一种数据结构,它...
5. Android高级话题:如Android动画总结、内存泄漏总结、权限处理、热修复原理、插件化入门、推送技术解析、Apk安装过程、数据结构线性表、栈和队列、树、图、散列、排序等算法及海量数据处理方法。 6. 设计模式:在...
29. **海量数据处理算法**:学习如拓扑排序、Kruskal算法、Prim算法、Dijkstra算法、Floyd算法等。 30. **剑指offer系列**:包含一系列算法题,涵盖了栈、队列、二叉树、查找、排序等问题。 31. **Android布局优化...
在数据结构和算法方面,文档提供了线性表、栈和队列、树、图、散列、查找、排序和海量数据处理算法等基础知识点的解析,以及一些经典的算法题目的解答,例如剑指offer中的二维数组中的查找、替换空格、从尾到头打印...
大数据时代的特征可以概括为“3V+3高”,即海量的数据量(Volume)、多样化的数据类型(Variety)、快速的数据流(Velocity),以及高并发、高可扩展性和高性能等要求。 通过狂神的Redis笔记,我们可以系统地学习...
Java的类库丰富,提供了许多适用于移动应用开发的功能模块,如网络通信、数据存储、图形处理等,大大简化了开发流程。 在mn-mobile中,Java的多线程机制是实现流畅用户体验的关键。通过并发处理,应用可以在后台...
Bitmap对象代表了一个位图图像,它包含了图像的所有像素数据。通过Bitmap,我们可以对图片进行各种操作,比如调整亮度、对比度、饱和度等。 实现点击图片变暗和变亮的关键在于改变图片的像素值。Android提供了...
总之,WallPepper项目展示了Java在Android开发中的强大能力,以及如何通过网络请求、数据解析、图片处理等技术,实现从互联网获取内容并应用于本地。同时,该项目也提醒我们,良好的用户体验往往来源于对细节的关注...
18. **海量数据问题**:通常涉及数据压缩、分布式存储、MapReduce等技术,优化算法和数据结构以减少I/O操作。 19. **一致性哈希**:解决分布式系统中的负载均衡问题,通过哈希函数将键映射到有限的服务器集合,...