27、优化数据结构

一、概述

要减少内存的消耗,除了使用高效的序列化类库以外,还有一个很重要的事情,就是优化数据结构。从而避免Java语法特性中所导致的额外内存的开销,
比如基于指针的Java数据结构,以及包装类型。

有一个关键的问题,就是优化什么数据结构?其实主要就是优化你的算子函数,内部使用到的局部数据,或者是算子函数外部的数据。都可以进行数据结构的优化。
优化之后,都会减少其对内存的消耗和占用。


二、如何优化数据结构

1、优先使用数组以及字符串,而不是集合类。也就是说,优先用array,而不是ArrayList、LinkedList、HashMap等集合。

比如,有个List<Integer> list = new ArrayList<Integer>(),将其替换为int[] arr = new int[]。这样的话,array既比List少了额外信息的存储开销,还能使用原始数据类型(int)来
存储数据,比List中用Integer这种包装类型存储数据,要节省内存的多。

还比如,通常企业级应用中的做法是,对于HashMap、List这种数据,统一用String拼接成特殊格式的字符串,
比如Map<Integer, Person> persons = new HashMap<Integer, Person>()。可以优化为,特殊的字符串格式:id:name,address|id:name,address...。


2、避免使用多层嵌套的对象结构。比如说,public class Teacher { private List<Student> students = new ArrayList<Student>() }。就是非常不好的例子。
因为Teacher类的内部又嵌套了大量的小Student对象。

比如说,对于上述例子,也完全可以使用特殊的字符串来进行数据的存储。比如,用json字符串来存储数据,就是一个很好的选择。

{"teacherId": 1, "teacherName": "leo", students:[{"studentId": 1, "studentName": "tom"},{"studentId":2, "studentName":"marry"}]}

3、对于有些能够避免的场景,尽量使用int替代String。因为String虽然比ArrayList、HashMap等数据结构高效多了,占用内存量少多了,但是之前分析过,
还是有额外信息的消耗。比如之前用String表示id,那么现在完全可以用数字类型的int,来进行替代。

这里提醒,在spark应用中,id就不要用常用的uuid了,因为无法转成int,就用自增的int类型的id即可。(sdfsdfdf-234242342-sdfsfsfdfd)

转载于:https://www.cnblogs.com/weiyiming007/p/11262371.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要减少程序在运行时的 RAM 占用率,可以采取以下几种方法: 1. 优化变量的使用:审查你的代码,确保只声明和使用必要的变量。避免过度使用全局变量,尽量使用局部变量,并在不需要时及时释放内存。 2. 动态内存管理:合理使用动态内存分配函数(如 `malloc`、`calloc` 和 `realloc`),在需要时分配内存,在不需要时释放内存。这样可以避免不必要的内存占用。 3. 压缩数据结构:考虑使用更紧凑的数据结构来存储数据,以减少内存占用。例如,使用位字段或位运算来存储标志位或状态信息。 4. 减少冗余数据:避免重复存储相同的数据。如果可能的话,可以通过引用或指针来共享数据,而不是每次都复制数据。 5. 优化算法和数据结构:选择适当的算法和数据结构可以减少对内存的需求。例如,使用哈希表代替数组或链表,可以提高查找效率并减少内存占用。 6. 编译器优化选项:利用编译器的优化选项,如优化等级和大小优化,以生成更有效率的代码。 7. 避免内存泄漏:确保在不再需要时正确释放已分配的内存,避免内存泄漏问题。 8. 使用更小的数据类型:根据实际需求,选择合适的数据类型。例如,如果你知道一个变量的值不会超过 255,可以使用 `uint8_t` 来代替 `int`,以减少内存占用。 以上是一些常见的方法,可以帮助你减少程序在运行时的 RAM 占用率。但请注意,在优化内存占用时,需要权衡代码的可读性、维护性和性能,以确保维持良好的软件质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值