当前位置: 首页 > news >正文

记录工作上一次计算的优化

一.背景描述:

1.有一个定时任务,共有4个步骤,每天跑T-1的数据,获取两种设备的运行数据并计算。这里称计算任务1,在第3步中:

  1. 获取8万左右的设备1,每次循环2000个设备,循环中查询设备1表的运行数据,每次查询4次,计算相关数据,并存入另一张表
  2. 获取6千左右的设备2,每次循环2000个设备,循环中查询设备2表的运行数据,每次查询2次,计算相关数据,并存入另一张表

2.查询设备1表查询4次获取的数据简要说明(以一个设备为例):

  1. 查1个设备近一年的数据
  2. 查1个设备近前一年的数据
  3. 查1个设备当前的数据,获取最大数据
  4. 查1个设备当年的数据,获取年数据

3.查询设备2表查询2次获取的数据简要说明(以一个设备为例):

  1. 查1个设备当前的数据,获取最大数据
  2. 查1个设备当年的数据,获取年数据

4.生产环境数据库本身问题,性能不佳,导致查询比较慢

5.设备1表的运行数据表每天8万数据,数据体量逐渐增加,更使得查询变慢

6.重点:

  1. 查询设备1表近一年的数据和前一年的数据是为了算最大的特征数据1
  2. 查询设备1表当前的数据,是为了算最大的特征数据2
  3. 查询设备2表当前的数据,是为了算最大的特征数据3

二.优化思路

2.1针对最大的特征数据1的优化

  1. 有取最大的特点近一年最大和近前一年最大
  2. 最大的特征数据1又分近一年最大和近前一年最大,这两个最大的值由两个值相乘得到,这里简称最大分项1,最大分项2,近一年最大和近前一年的分项是一样的,只是范围不同
  3. 近一年最大和近前一年时间是滑动的,比如今天是24年10月29号,那跑任务的话,就是2023.10.28-2024.10.28,到了明天24年10月30号,跑任务的话,就是2023.10.29-2024.10.29
  4. 近一年最大和近前一年最大时间,左右端点都是滑动的

基于这样的场景,考虑:

  • 初始化一次近一年最大和近前一年两个分项的值,简称初始化表1。存365个(或366个)最大分项1和最大分项2,以逗号分割,然后在定时任务的时候,只需要取T-1一天的数据,然后和初始化表中的数据比较,哪个大取哪个,然后剔除近一年集合的第一位,把大的值放到最后。这样就减少了2次大的查询
  • 新增一个定时任务(这里简称定时任务2)每天获取T-2的数据,更新初始化表的两个分项逗号分隔的集合,和上面说到的一样,取T-2一天的数据,然后和初始化表中的数据比较,哪个大取哪个,然后剔除近一年集合的第一位,把前面剔除掉的近一年集合的第一位放到这里的末尾
  • 对于前一年两个分项也是如此。

这是一个示例图

通过这样的方式,正常情况下能保证初始化表1的数据正确,定时任务中取数计算也无误。

2.2针对最大的特征数据2、3的优化

  1. 有取最大的特点:今年最大
  2. 每天定时任务都取新的范围的最大
  3. 两个最大指标:最大运行数据,最大运行数据的日期
  4. 时间范围左端点是固定的,右端点是滑动的

基于这样的场景,考虑:

  • 初始化一次两种设备最大运行数据,最大运行数据的日期。简称初始化表2
  • 在定时任务的时候,只需要取T-1一天的数据,然后和初始化表中的数据比较,哪个大取哪个
  • 新增一个定时任务每天获取T-2的数据,和初始化表中的数据比较,哪个大取哪个,更新初始化表的最大运行数据,最大运行数据的日期

通过这样的方式,正常情况下能保证初始化表2的数据正确,定时任务中取数计算也无误。

三.优化前

1.计算任务1第3步 执行耗时较久,一般要4 个小时甚至更久
2.整个计算任务 执行超过12 个小时,导致定时任务超时失效。

四.优化后

1.计算任务1执行稳定在1.5小时左右

2.定时任务2稳定在6小时左右,一般只需要初始化一次

五.思考和心得体会

1.当时这个优化思路是领导提的,我并没有意识到这一点,由此可以看出认识特定场景和洞悉问题的能力还有待提高。这个算法并不复杂,重要的是发现场景的规律,才能更好的解决问题

2.优化是否合理,应该经过较为确切的推敲和验证

3.优化是否有效,在论证优化合理后,在生产环境发布再得以验证


http://www.mrgr.cn/news/61515.html

相关文章:

  • 学习华为熵减,激发组织活力
  • 万物互联的背后:MCU嵌入式硬件的奇幻之旅
  • 【“软件工程”基础概念学习】
  • Maven 仓库的分类
  • 【HarmonyOS Next NAPI 深度探索1】Node.js 和 CC++ 原生扩展简介
  • UI自动化测试框架playwright--初级入门
  • 基于JSP的篮球系列网上商城系统【附源码】
  • 图的最短路径算法-迪杰斯特拉(Dijkstra)算法与弗洛伊德(Frolyd)算法(更新中)
  • Git提交代码完整流程
  • 基于SSM+小程序的购物管理系统1
  • Redis-README官方入门文档
  • 深度学习数学基础之链式法则
  • 基于spootboot学生选课系统设计与实现
  • C++17 折叠表达式
  • 【数据结构】排序代码分享
  • WPF+MVVM案例实战(十一)- 环形进度条实现
  • 4. STM32之TIM实验--输出比较(PWM输出,电机,四轴飞行器,智能车,机器人)--(实验2:PWM驱动舵机)
  • 使用 Python 理解置信区间
  • 组合总和
  • 深度学习:梯度下降算法简介
  • 算法练习:LCR 179. 查找总价格为目标值的两个商品
  • “格格不入”的星瑞东方曜,燃油市场有麻烦了
  • 【Rust笔记】Rocket实现自定义的Responder
  • 【数据结构与算法】力扣 23. 合并 K 个升序链表
  • 【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-8
  • 【python实操】python小程序之测试报告