在探索spark优化的过程中,百度出来的千篇一律无非都是一些配置的修改,其实代码的优化是一个非常关键,甚至可以起决定性作用的步骤。
最近根据自己的项目内容完成了一个基于spark的分块矩阵求逆,需要求一个20000*20000矩阵的逆。单机的工具如jama 求出来得按小时计。由于公司集群硬件条件有限,在处理时一直存在着内存溢出和计算耗时过长的问题。。。。在不停的优化的过程偶尔在网上看到了java中有关double和float数据的存储和计算性能对比,于是尝试着将自己使用的double类型数据改成了float,发现内存不再溢出了,计算性能也大大提升。。。。。。
首先提一下。。float的范围为-2^128 ~ +2^127,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1023,也即-1.79E+308 ~ +1.79E+308。在网上查找的有关double类型和float类型在计算时候的性能对比,有的说float比doule快一倍,也有人说float是转为double型再处理的。。。怎么办,自己动手试试。结果就是由double型转为float之后,数据所占的内存和计算性能的确可以提升一倍左右。。。不过由此确实会产生一定的精度丢失。
根据不停的测试总结出来,当你的计算需求满足以下情况时,建议将double类型转换成float类型
- 情况1
- 当你的需求对计算结果的精度允许有一点损失
- 数据的精度已经多次处理之后的精度不会超过float的精度范围,即-3.40E+38,即便超过了也对你的影响也可以接受
- 对某个数据进行处理的累积次数很少。即: 如果 你只需要将某几个或几十个数据相乘,但是有100亿组这样的数据,你只需要求出100亿组乘积就行。。。。此时将doule类型转换成float型,这几个数据相乘后的精度损失非常小,小到你可以接受
- 情况2
- 你的double型数据很多,数据处理的累积次数很小,或者说基本没有。。(感觉这点和上面的是一种- -)
满足上述情况你大可以试一下将原来的double型转为float,这样精度损失你可以接受,shuffle过程的数据量也小一倍,计算耗时也将快1倍左右!
不信你可以试试。