4. 本地存储技术:存储介质、文件系统与数据格式

大家好,我是老张。今天咱们聊聊本地存储。说实话,做储能数据采集这几年,我踩过的坑有一半都跟存储有关。你想想看,一个储能柜在野外跑三五年,数据要是丢了,那真是叫天天不应。

本地存储看似简单,其实门道不少。选什么介质?用什么文件系统?数据怎么存?每一步都影响系统的稳定性和寿命。我习惯把这个问题拆成三个层面来考虑:硬件介质、文件系统、数据格式。咱们一个一个说。

本地存储技术三要素 存储介质 SD卡 eMMC NVMe SSD (容量/速度/寿命) 文件系统 FAT32 ext4 LittleFS (兼容/日志/磨损均衡) 数据格式 CSV JSON 二进制 (可读/结构/效率) 三者需匹配:介质特性 → 文件系统能力 → 数据格式需求

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做长期数据记录,我吃过这个亏。

我记得有一次,一个客户要求用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