如何实现超高速数据存储?树莓派百万采样率传感器数据存储方案问询
树莓派1MSPS传感器采样存储方案
先做基础数据量核算:100万次/秒采样率 × 30秒 = 3000万条采样数据,单条6字符的总数据量约为180MB,远低于树莓派常规内存容量,哪怕是1GB版本的树莓派也完全可以容纳全量数据。
优先方案:内存暂存+采样结束后批量写入
这个方案完全避免采样过程中的IO操作,不会对采样速度造成任何影响,是当前场景下的最优选择,实现要点如下:
- 内存层用预分配的固定长度缓冲区,不要用动态扩容容器。比如Python环境下用
array模块、numpy预分配对应长度的数组,或是直接用bytearray预开180MB的连续字节空间,避免动态扩容的额外开销。 - 采样逻辑和IO逻辑完全分离,用独立线程跑采样任务,采样线程仅负责往缓冲区写入数据,不碰任何磁盘、网络IO操作,避免IO阻塞导致采样点丢失。
- 30秒采样全部完成后,再由单独的IO线程一次性将整块缓冲区写入磁盘,写入时使用二进制模式写入,不要逐行写文本格式,全量写入耗时通常不超过2秒,无额外性能损耗。
- 如果担心中途掉电丢失数据,可以每隔5秒触发一次后台异步批量写入,每次写入30MB数据,写入操作全程在独立线程完成,不能阻塞采样线程。
备选方案:实时流式写入
如果后续需要延长采样时长、内存无法容纳全量数据时,可以选择该方案,实现要点如下:
- 不要写入内置SD卡,SD卡随机写入速度极低,优先外接USB3.0接口的固态U盘或移动SSD,顺序写入速度可达100MB/s以上,远高于当前场景6MB/s的写入带宽需求。
- 采用块写入机制,不要单条数据写入,比如每攒满1MB(约17万条数据)再执行一次磁盘写入操作,大幅减少IO调用次数。
- 不需要手动维护复杂的内存缓冲,操作系统自带的页缓存会自动处理批量刷盘逻辑,只要是顺序写入场景,不会阻塞采样逻辑。
- Python环境下不要用内置
write方法逐次写单条数据,建议用io.BufferedWriter设置1MB以上的缓冲区,自动完成块写入。
通用注意事项
- 不要存储为CSV等文本格式,直接存二进制定长格式,可省去转义、换行符等额外开销,读写速度是文本格式的3~10倍,后续读取时直接按6字节定长切分即可。
- 如果采样程序对实时性要求极高,可以用
chrt命令将采样线程的调度优先级设置为实时调度,避免被其他系统进程抢占CPU资源。 - 有开发能力的话优先用C/C++实现采样逻辑,性能比Python高很多,内存开销也更低,180MB级别的数据处理完全无压力。
内容的提问来源于stack exchange,提问作者Enzo Damato
相关产品推荐
相关产品推荐

