2、数据采集与存储:数据源类型、数据采集策略、数据存储格式
做算法调试,最怕什么?
我个人最怕的是——数据丢了,或者数据不对,你还不知道。
数据回放这件事,说白了就是「把现场还原出来」。但前提是,你得先把现场的数据给存好。这一章我们就聊聊数据采集与存储的那些事。嗯,都是我在项目里踩过的坑,你听听看。
2.1 数据源类型:你的数据从哪来?
数据源的类型,决定了你的采集策略。我一般把它们分成三类:
- 传感器数据:比如摄像头、激光雷达、IMU。这类数据量大,频率高,实时性强。
- 系统日志:比如应用日志、系统事件、错误栈。这类数据稀疏,但信息密度高。
- 中间结果:比如模型推理输出、特征向量、中间变量。这类数据是调试的核心,但往往被忽略。
你想想看,如果只存了传感器数据,没有存中间结果,那回放的时候你只能看到「输入」和「输出」,中间发生了什么?一片黑盒。
我的建议: 至少把关键节点的中间结果也存下来。哪怕只存一部分,也能帮你定位问题。
2.2 数据采集策略:怎么采才不丢?
数据采集不是「录屏」那么简单。你得考虑几个问题:
- 全量采集 vs 采样采集:全量采集最安全,但存储压力大。采样采集省空间,但可能漏掉关键帧。
- 同步采集 vs 异步采集:多路数据源之间,时间戳对齐是老大难。我遇到过摄像头和激光雷达时间戳差了200ms,回放时画面和点云完全对不上。
- 触发式采集 vs 持续采集:触发式只在特定事件发生时记录,适合异常场景。持续采集则适合常规运行。
我个人习惯的做法是:持续采集 + 环形缓冲区。平时一直录,但只保留最近N分钟的数据。一旦触发异常事件,就把缓冲区里的数据「冻结」下来,存到持久化存储里。
小技巧: 环形缓冲区的大小,建议至少能覆盖你调试时需要的上下文。我一般设成30秒到2分钟。
2.3 数据存储格式:JSON / CSV / Parquet
格式选不对,后面全白费。这三种格式我都用过,说说我的感受。
| 格式 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|
| JSON | 可读性强,结构灵活,支持嵌套 | 体积大,解析慢,不适合大规模数据 | 配置、小样本、调试阶段 |
| CSV | 简单,通用,Excel可直接打开 | 不支持嵌套,列数固定,类型信息丢失 | 表格型数据、统计分析 |
| Parquet | 列式存储,压缩率高,查询快 | 可读性差,工具链要求高 | 大规模数据、生产环境 |
我曾经在一个项目里,用JSON存了3小时的传感器数据,结果文件大小超过10GB,加载一次要5分钟。后来换成Parquet,文件压缩到1.2GB,加载时间降到10秒。嗯,差距就是这么大。
避坑指南: 我曾经因为偷懒,直接用CSV存了带时间戳的嵌套结构,结果解析时发现时间戳被Excel自动转换了格式,数据全乱了。从那以后,我坚持用ISO 8601格式存时间戳,并且优先用Parquet。
2.4 知识体系总览
下面这张图,是我自己总结的数据采集与存储的核心逻辑。你看一眼,心里就有谱了。
说白了,数据采集与存储就是三个环节:知道有什么数据 → 决定怎么采 → 选好格式存下来。每一步都有坑,但每一步也都有成熟的解法。
一句话总结: 别等到调试时才发现数据不全。提前想好数据源、采策略、存格式,后面能省你80%的排查时间。