尘土与星辰 -1992|第304章|历史库的灰尘|中文
机房的空调出风口持续吐出冷风,屏幕上的日志滚动条已经跑了四个小时。林尘靠在人体工学椅里,左脚搁在自带的硬木脚垫上,膝盖下方垫着一本旧版《计算机网络》。书脊已经磨白,页角卷曲,是大学图书馆淘汰时他花两块钱买下的。 流水线状态栏显示:已处理 14.2 万条。异常队
第304章 历史库的灰尘
机房的空调出风口持续吐出冷风,屏幕上的日志滚动条已经跑了四个小时。林尘靠在人体工学椅里,左脚搁在自带的硬木脚垫上,膝盖下方垫着一本旧版《计算机网络》。书脊已经磨白,页角卷曲,是大学图书馆淘汰时他花两块钱买下的。
流水线状态栏显示:已处理 14.2 万条。异常队列:3841 条。进度 18.7%。
他端起桌上的搪瓷缸,里面的枸杞水已经凉透。喝了一口,涩味顺着喉咙下去,胃里泛起一阵轻微的痉挛。他没加糖,也没换茶叶。省钱是刻在骨子里的习惯,哪怕公司账上已经能撑过半年现金流,他依然用着这个掉漆的缸子。
手机屏幕亮起。苏曼发来一条消息:“省二院信息科把硬盘送过来了。三年门诊日志,全量脱敏前原始库。格式是混合的,2018年前的系统导出的CSV,2019年后是JSON,中间夹杂了约15%的PDF扫描件。他们只给了七天,硬盘下午三点到。”
林尘回复:“收到。准备备用服务器。下午我接。”
他关掉消息窗口,调出异常队列的抽样日志。前3841条报错集中在三个点:一是时间戳格式不统一,有的带时区偏移,有的只有YYYYMMDD;二是诊断字段存在大量手写体转码后的乱码,GB2312和GBK混用,部分生僻字被替换成了?;三是患者ID与就诊流水号不匹配,存在明显的历史系统迁移断层。
这不是脏数据,这是地质层。
林尘翻开错题本,在新的一页写下:多源异构。编码断层。ID映射断裂。 笔尖划过纸面,发出轻微的沙沙声。他合上本子,开始重构DataAnonymizerV1的解析层。
下午两点五十,苏曼推开机房的门,手里拎着一个黑色的防震硬盘盒。她没说话,把盒子放在控制台上,顺手带上门。机房里重新只剩下服务器风扇的低频嗡鸣。
林尘接上硬盘,挂载到隔离沙箱。数据总量显示:47.6GB。他深吸一口气,敲下启动指令。
进度条开始爬升。前十分钟一切正常。到第14分钟,日志窗口突然跳出连续的红字:PARSE_ERROR: Invalid UTF-8 sequence at offset 0x8F2A。流水线暂停。
林尘没有皱眉。他早就预料到这一步。他调出十六进制查看器,定位到报错偏移量。原始字节是0xD2 0xBB,在GBK里是“一”,但在UTF-8解码器里直接崩溃。他写了一个预检脚本,先遍历全库的字节分布,统计非UTF-8字符的占比。结果显示:12.4%。
他新建了一个EncodingFallback模块。遇到非法字节序列,不中断,不丢弃,先标记原始编码,尝试用chardet库做二次识别,识别失败则写入隔离区,保留原始十六进制快照。脚本跑通,流水线重启。
进度条重新开始移动。速度比之前慢了约30%,但不再崩溃。
林尘站起身,去洗手间用冷水洗了把脸。镜子里的人眼窝深陷,胡茬泛青。他低头看了看左脚,脚踝处的皮肤因为长时间压迫已经泛白。他扶着洗手台,慢慢做了两组拉伸。肌肉纤维传来熟悉的酸胀感,像生锈的齿轮被强行咬合。他闭上眼,数了十秒,走回工位。
下午五点,处理量突破20万条。异常队列堆积到1.1万条。
苏曼敲门进来,放下一份外卖和两瓶矿泉水。“先吃饭。信息科那边说,2016年到2017年之间,医院换过一次HIS系统,老数据是人工导出的,很多字段是空的。你们要不要跳过那部分?”
“不能跳。”林尘打开饭盒,是简单的青椒肉丝和米饭。“卫健委要的是连续三十天真实世界数据。跳过两年,回溯报告的时间轴就断了。批文不会过。”
他扒了两口饭,放下筷子,继续盯着屏幕。异常队列里,有一批记录反复触发FIELD_MISSING。他点开抽样,发现是同一批患者的复诊记录,主诉字段为空,但检验指标齐全。医生当年可能只开了化验单,没写病历。
林尘调出ICD-10映射表,写了一个规则:如果主诉为空,但检验指标包含特定组合(如空腹血糖≥7.0且糖化血红蛋白≥6.5%),则自动推断为“疑似糖尿病随访”,打上INFERRED标签,置信度设为0.6。不替代临床诊断,只保证数据链不断。
他敲下回车。流水线吞下这批数据,继续向前。
晚上九点,进度达到64%。林尘的左脚开始不受控制地轻微抽搐。他停下敲击,把脚从脚垫上拿下来,平放在地上。刺痛感顺着小腿往上爬。他咬住后槽牙,没出声。从抽屉里拿出一瓶布洛芬,干咽了两粒。
苏曼还没走。她在旁边的工位上整理伦理委员会的补充材料,偶尔抬头看一眼屏幕。
“你的腿撑不到周五。”她声音很轻,没有劝说的语气,只是陈述。
“流水线已经自动化了。”林尘看着日志,“后面主要是人工复核异常队列。我坐着就行。”
“坐着也会坏死。”苏曼合上文件夹,“明天我去信息科,申请调取2016年的纸质病历归档目录。用目录做交叉校验,能省掉你一半的推断工作量。”
林尘点了点头。“好。把目录拍成高清照片,按时间戳排序发我。”
苏曼看了他两秒,转身离开。机房门关上。
林尘重新把手放在键盘上。屏幕冷光映着他的脸。他调出异常队列,开始逐条核对。有些乱码确实无法还原,他只能保留原始快照,在报告里注明“历史系统编码丢失,已做隔离处理”。有些缺失字段,他通过检验指标和用药记录反推。工作枯燥,重复,没有捷径。但他习惯了。从县城网吧接外包开始,他就知道,技术不是魔法,是体力活。是把一堆烂摊子,一行一行码整齐。
凌晨一点,进度突破85%。异常队列降至4000条。
林尘揉了揉眉心,准备做最后一轮批量校验。就在他敲下指令的瞬间,日志窗口突然跳出一行黄字:WARNING: Timestamp collision detected. Batch 2019-Q3, 14,200 records share identical ingestion time.
他手指停在半空。
十四千条记录,入库时间完全一致。精确到毫秒。
在真实的门诊系统里,这是不可能发生的。除非是批量导入,或者系统时钟被人为重置过。林尘调出这批数据的原始文件,发现它们全部来自省二院2019年9月的一次“历史数据迁移备份”。迁移日志显示,当时为了赶新系统上线,信息科外包团队用脚本做了全量覆盖。
覆盖意味着什么?意味着原始就诊流水可能被重写,时间轴可能被压缩,脱敏后的数据回溯,可能会在卫健委的审计里被判定为“数据真实性存疑”。
林尘盯着那行黄字,呼吸平稳。他没有慌。他打开错题本,在新的一页写下:批量覆盖。时间戳碰撞。审计风险。
他关掉警告窗口,新建了一个校验脚本。不修复,不掩盖。他把这1.4万条记录单独抽离,打上MIGRATION_ARTIFACT标签,准备在最终报告里附上迁移日志的原始截图和交叉验证路径。
合规不是完美,是透明。
他敲下回车。脚本开始运行。窗外的城市已经彻底安静,只有机房的风扇还在转。林尘靠在椅背上,闭上眼睛。左脚依然刺痛,但他没动。
明天早上,苏曼会带回纸质目录。下午,他要完成最后一轮映射。后天,报告初稿。
七天。还剩下五天。
屏幕上的进度条缓慢爬升。林尘睁开眼,手指重新落在键盘上。下一步,是核对迁移日志的原始哈希值。
More from WayDigital
Continue through other published articles from the same publisher.
Comments
0 public responses
All visitors can read comments. Sign in to join the discussion.
Log in to comment