第463章 得来全不费功夫 (第2/2页)
扒拉着翻出运行日志,最后一行明明白白写着:处理记录数24768条,错误数0。
李哥的眼镜差点从鼻梁上滑下来。心跳都漏了一拍。
“你怎么改的?”他惊呆了。
韩学涛手指点了点屏幕:“资料里写得很清楚,北斗单星原始时间戳是毫秒级的,单帧最大计数值超过65535。你这个脚本为了省内存,把时间戳塞进了16位整型变量里,数据量一大了自然溢出崩溃。我换成无符号长整型,又加了两个溢出判断分支,就好了。”
他说得云淡风轻的,跟解释一加一等于二似的。而李哥盯着那几行代码,嘴巴微微张着,半天没合拢。
当年这个bug他前前后后折腾了一个礼拜,才算勉强“解决”了——其实根本没根治,就是绕了个弯子,让脚本每隔两周才崩一次,好歹能凑合用。他一直以为是数据量太大导致的性能瓶颈,还琢磨过要不要申请加内存。
结果根子就在这儿。
李哥直起身,慢慢摘下眼镜擦了擦,又看了一眼屏幕上那十几行代码,心里头忽然涌上一阵恍惚——前三年像是白活了一样。
韩学涛把U盘从接口里拔出来,随手递过去:“改好了,收起来吧。”
李哥愣愣地接过来,张了张嘴想说点什么,韩学涛已经转回自己电脑前,点开了桌面上“全量历史脏数据清洗”那个文件夹。
这是于主任交给他的任务。
脏数据清洗这活儿,相当让人头疼。
说白了就是北斗地面站从双星接收到的原始观测数据里,混着各种乱七八糟的东西——信号中断时候的无效帧、卫星仰角太低时记录的不稳定值、设备重启那一瞬间触发的错误码。这些东西不清干净,后面的平差解算根本跑不起来。
三组日常就是写各种规则脚本,一条一条地筛,把这个文件的异常行删掉,把那个字段的越界值置空。
活儿杂、量大、还枯燥。
一个批次跑下来少说大半天,中间还经常因为漏了某种异常类型报错中断。
韩学涛翻开余国平给他的那堆资料里中间某一本,停在其中一页。
那一页写的是北斗原始数据帧结构定义,里面有一个字段被加粗标了出来:数据质量标识码。规范里写得明明白白,这个码由星上自主判读生成,一共八位,每一位代表一个维度的健康状态。某位是1,就说明对应维度的数据不可用。
他盯着这一页看了大概两分钟,然后关掉文档,打开清洗脚本编辑器,把原本那几百行筛查逻辑全选、删除、清空。
重新写了一个主循环。
核心逻辑简单清晰:先读每个数据帧头部的质量标识码;质量码不是零的直接跳过,连后面的字段都懒得解析;质量码全是零的,整帧完整保留。出口处再加一行简单的统计输出,把每类质量码对应的帧数自动汇总成表。
总共就写了二十来行。
保存,运行。
进度条稳稳地往前走,速度比原先那个逐字段筛查的脚本快了不知道多少倍。韩学涛靠在椅背上,看着屏幕上的数字一个一个往上跳,顺手端起搪瓷缸喝了口水。
而那边李哥攥着U盘回了工位,坐下来第一件事不是干活,是发呆。
他盯着显示器,脑子里翻来覆去就一个念头:那个bug困扰了自己整整三年,结果人家翻了翻资料就解决了。三年通宵熬出来的东西,在别人那儿就是几行代码的事儿。
他本来想好了今天要调的一个思路,现在那个思路也变得模糊了。整个人像被抽空了似的,目光空空洞洞地望着屏幕上那个一闪一闪的光标。
就这么呆坐了半小时。
李哥终于动了动,使劲搓了把脸,从抽屉里摸出饭卡,起身去食堂小卖部买了两罐红牛。走回来坐定,拉开拉环,仰头灌了一大口。
目光无意间往旁边一瞥,正好看见韩学涛的屏幕上跳出一行字:数据清洗完成。
总计处理记录数:1847329条。有效保留:1526641条。异常剔除:320688条。清洗用时:00:27:43。
李哥嘴里的红牛还没咽下去,“噗”地一口全喷在自己键盘上。
“全量脏数据清洗?”他声音都变了调,红牛顺着下巴往下淌也顾不上擦,“你……半个小时就搞完了?”