4. 本地存储技术:存储介质、文件系统与数据格式
大家好,我是老张。今天咱们聊聊本地存储。说实话,做储能数据采集这几年,我踩过的坑有一半都跟存储有关。你想想看,一个储能柜在野外跑三五年,数据要是丢了,那真是叫天天不应。
本地存储看似简单,其实门道不少。选什么介质?用什么文件系统?数据怎么存?每一步都影响系统的稳定性和寿命。我习惯把这个问题拆成三个层面来考虑:硬件介质、文件系统、数据格式。咱们一个一个说。
4.1 存储介质对比:SD卡、eMMC、NVMe SSD
先说说介质。我见过不少方案,上来就用SD卡,觉得便宜又方便。但你要知道,SD卡在工业场景下其实挺脆弱的。我有个项目,在西北的储能站,夏天温度能到60度,SD卡直接罢工了。
下面这张表是我自己整理的,你可以参考一下:
| 特性 | SD卡 | eMMC | NVMe SSD |
|---|---|---|---|
| 典型容量 | 8GB - 256GB | 4GB - 128GB | 128GB - 2TB |
| 顺序读写 | ~20MB/s | ~150MB/s | ~3500MB/s |
| 随机IOPS | 低(~100) | 中(~5000) | 高(~500K) |
| 功耗 | ~0.5W | ~1W | ~3-8W |
| 接口 | SPI/SDIO | eMMC 5.1 | PCIe 3.0/4.0 |
| 寿命(TBW) | 低(~10TB) | 中(~30TB) | 高(~150TB) |
| 成本(每GB) | ~0.1元 | ~0.3元 | ~0.5元 |
| 适用场景 | 日志、配置 | 嵌入式主存 | 高速数据采集 |
我的建议: 对于储能数据采集,如果数据量不大(每天几百MB),eMMC是性价比最高的选择。它比SD卡可靠,又比SSD便宜。我最近一个项目用的就是eMMC,跑了两年没出过问题。
避坑指南: 我曾经在一个项目中用了消费级SD卡,结果三个月后就开始丢数据。后来换成工业级SD卡(支持SLC模式),问题才解决。记住,消费级和工业级在温度范围和擦写寿命上差很多。
4.2 文件系统选择:FAT32、ext4、LittleFS
介质选好了,接下来是文件系统。很多人觉得文件系统无所谓,能用就行。其实不然。文件系统直接影响数据的安全性和写入效率。
我简单说说三种常见的:
- FAT32:兼容性最好,Windows、Linux、Mac都能读。但单个文件不能超过4GB,而且没有日志功能。断电容易丢数据。适合做数据交换,不适合做长期存储。
- ext4:Linux的标配,有日志功能,断电后能快速恢复。支持大文件和大分区。但需要Linux内核支持,资源开销稍大。我一般用在主控板上。
- LittleFS:专门为嵌入式设计的文件系统。支持磨损均衡和掉电保护。资源开销极小,几KB的RAM就能跑。适合用在MCU上,比如ESP32、STM32。
你可能会问,到底选哪个?我的经验是这样的:
选型口诀:
- 如果跑Linux,用ext4,省心。
- 如果跑RTOS或裸机,用LittleFS,安全。
- 如果只是临时存数据然后导出,用FAT32,方便。
- 千万别在MCU上用FAT32做长期数据记录,我吃过这个亏。
- 如果跑Linux,用ext4,省心。
- 如果跑RTOS或裸机,用LittleFS,安全。
- 如果只是临时存数据然后导出,用FAT32,方便。
- 千万别在MCU上用FAT32做长期数据记录,我吃过这个亏。
我记得有一次,一个客户要求用FAT32做数据记录。结果现场断电几次后,文件系统就坏了,数据全丢。后来换成LittleFS,再也没出过问题。说白了,嵌入式环境下的断电保护比什么都重要。
4.3 数据存储格式:CSV、JSON、二进制
最后说说数据格式。这个看似简单,但选错了后面会很痛苦。
我习惯这样区分:
- CSV:纯文本,用逗号分隔。可读性好,Excel直接打开。但解析效率低,不支持嵌套结构。适合简单的传感器数据记录。
- JSON:结构化文本,支持嵌套。可读性也不错,但体积大,解析慢。适合配置文件和少量数据交换。
- 二进制:最紧凑,解析最快。但可读性差,需要定义协议。适合高频数据采集和长期存储。
举个例子,假设我们要存一组电压、电流、温度数据:
// CSV格式
timestamp,voltage,current,temperature
2024-01-01 00:00:00,48.5,10.2,25.3
2024-01-01 00:01:00,48.6,10.1,25.4
// JSON格式
{
"data": [
{"ts": "2024-01-01 00:00:00", "v": 48.5, "i": 10.2, "t": 25.3},
{"ts": "2024-01-01 00:01:00", "v": 48.6, "i": 10.1, "t": 25.4}
]
}
// 二进制格式(假设结构体)
typedef struct {
uint32_t timestamp; // Unix时间戳
float voltage; // 电压
float current; // 电流
float temperature; // 温度
} data_point_t;
我的习惯: 对于高频数据(比如1秒采一次),我肯定用二进制。一个数据点才16字节,一天也就1.3MB。如果用JSON,同样的数据可能要100字节以上,一天就是8MB。你想想看,一个储能站跑三年,数据量差多少?
不过话说回来,如果数据量不大,或者需要人工查看,CSV和JSON也有它们的优势。我一般会在系统中同时支持两种格式:二进制用于实时记录,CSV用于导出分析。
注意: 用二进制格式时,一定要定义好协议版本号。我曾经因为改了结构体没更新版本号,导致旧数据全读不出来。嗯,这个教训挺深刻的。
好了,关于本地存储技术,今天就聊这么多。记住一句话:没有最好的方案,只有最合适的方案。选型时要综合考虑成本、可靠性、开发难度和维护成本。
公众号:蓝海资料掘金营,微信deep3321