关于Spark处理double类型数据时的一个小优化

本文通过实际案例分享了在Spark应用中使用float替代double进行大规模矩阵运算的经验,有效解决了内存溢出问题并显著提升了计算效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在探索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

  1. 当你的需求对计算结果的精度允许有一点损失
  2. 数据的精度已经多次处理之后的精度不会超过float的精度范围,即-3.40E+38,即便超过了也对你的影响也可以接受
  3. 对某个数据进行处理的累积次数很少。即如果 你只需要将某几个或几十个数据相乘,但是有100亿组这样的数据,你只需要求出100亿组乘积就行。。。。此时将doule类型转换成float型,这几个数据相乘后的精度损失非常小,小到你可以接受

  • 情况2

  1. 你的double型数据很多,数据处理的累积次数很小,或者说基本没有。。(感觉这点和上面的是一种- -)

满足上述情况你大可以试一下将原来的double型转为float,这样精度损失你可以接受,shuffle过程的数据量也小一倍,计算耗时也将快1倍左右!

不信你可以试试。得意得意得意


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱继业1993

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值