V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
LeeReamond
V2EX  ›  问与答

冷存大量浮点数类型数据,有什么合适的压缩方案吗?

  •  
  •   LeeReamond · 2021-02-16 20:59:03 +08:00 · 1739 次点击
    这是一个创建于 1374 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,自用传感器有大量时序数据需要记录,大概格式是时间-》传感器数据 A,传感器数据 B....等等这样,单个数据类型为单精度浮点数,小数点后 6 位以内

    因为记录精度精确到毫秒,所以数据量非常大,粗略估算了一下在 1T 到 10T 之间这个数量级,

    这些是原始数据,实际上工作中是用不到的,工作用到的数据是处理之后的版本,但是我觉得原始数据如果可能的话最好还是保存一下,谁知道以后可能出什么问题呢。

    之前有了解过时序数据库似乎很适合储存这类传感器数据。但是我目前这个需要的是完全冷存,不需要有任何增删改查的功能,只需要储存体积尽可能小,这样可以少买几块硬盘。神通广大的 V 友有什么合适的方式推荐吗

    20 条回复    2021-02-17 10:26:01 +08:00
    codehz
        1
    codehz  
       2021-02-16 21:07:35 +08:00 via Android
    直接序列存储+没有强数据安全需求的话根本用不到数据库,文件系统都不需要,直接按块写盘就好了。。。然后找个其他存储设备存元数据(即一块盘写了哪些东西,写了几个字节这些信息)
    unixeno
        2
    unixeno  
       2021-02-16 21:15:44 +08:00 via Android   ❤️ 1
    10T 很大么,不是一块硬盘就完事儿了?
    imn1
        3
    imn1  
       2021-02-16 21:26:56 +08:00
    对于原始数据,我的话,不会考虑耗费硬盘多少,只考虑必要时能否读出,定期转存的成本(倒数据的工作量)
    thedrwu
        4
    thedrwu  
       2021-02-16 21:43:25 +08:00 via Android
    HDF
    felixcode
        5
    felixcode  
       2021-02-16 21:45:30 +08:00 via Android
    如果直接简单粗暴用纯文本的话,压缩率会很可观的吧。
    larry801
        6
    larry801  
       2021-02-16 22:05:21 +08:00
    @felixcode 全是单精度当然直接存二进制啦 转文本不多一层么
    各个云厂商的冷数据服务如何?
    无规律的单精度压缩率估计不好看 省不了多少 考虑一下安全性吧 等要的时候又坏了才坑呢
    zmj1316
        7
    zmj1316  
       2021-02-16 22:12:33 +08:00
    12T 硬盘也不贵,还可以开启文件系统的压缩
    xupefei
        8
    xupefei  
       2021-02-16 22:12:46 +08:00 via iPhone
    压缩后存 B2 或 glacier 的话,每月 20 美元应该搞得定。
    买个大硬盘也可以,不贵。
    3dwelcome
        9
    3dwelcome  
       2021-02-16 22:18:50 +08:00 via Android
    用 diff 算法按照 32bit 转置后存。
    比如 1.21 ,1.23 ,1.24 就变成了三个 32bit 字节流,用转置算法把三个 sign 位拼一起压缩,把三个 exp 位拼接一起压缩,把三个 fraction 位拼一起压缩。
    这样数据值变动小,压缩率就很可观。
    thedrwu
        10
    thedrwu  
       2021-02-16 22:28:45 +08:00 via Android
    考虑一下直接存采样的整数数据?
    快速的模数转换,有 16 位进度已经很高了,容量需求直接砍一半。如果能省下几位 LSB,或者用 dithering 抖过去,又能节省十分之几的空间。
    LeeReamond
        11
    LeeReamond  
    OP
       2021-02-16 23:48:29 +08:00
    @imn1 确实硬盘不是首要考量,但最好还是空间小一些,资金有限

    @3dwelcome 没有听懂,不过听起来很诱人,想试一下这个方案,我的每个数值之间区别不大,容我研究研究。
    ryd994
        12
    ryd994  
       2021-02-16 23:57:48 +08:00
    二进制,按时间分文件,然后压缩
    想省事的话就用文件系统自带的压缩
    jworg
        13
    jworg  
       2021-02-17 00:09:45 +08:00   ❤️ 1
    10 楼正解,作为嵌入式一直很怀疑对接的人非要浮点数的必要,明明存采样 adc 的原始数据就可以了,然后注释一下转化公式。这个让下面的嵌入式改下面上传数据格式就可以了,比起浮点数还有无损的优点。
    LeeReamond
        14
    LeeReamond  
    OP
       2021-02-17 00:59:20 +08:00
    感谢各位提供的思路,按楼上设想我准备输出成整数,然后采用某些已经有的序列化方案转换成二进制,最后做一下简单的压缩,理论上单个数值的合适储存体积应该小于 2bytes,经过上述操作可以比较接近这个数值,没什么不满意的了。
    vhysug01
        15
    vhysug01  
       2021-02-17 01:15:25 +08:00 via iPhone
    之前做股票价格数据,一般的数字存 csv 再压缩,能省 90%的空间
    siyemiaokube
        16
    siyemiaokube  
       2021-02-17 03:32:20 +08:00 via iPhone
    这个级别的时序数据,应该很需要考虑安全性了吧?感觉非常容易丢失啊
    siyemiaokube
        17
    siyemiaokube  
       2021-02-17 03:36:11 +08:00 via iPhone
    也要取决于你这个传感器的工作环境了,压缩算法自己造轮子的话,我感觉很可能存在大量丢失数据的风险。相对地,比起直接存定点数,压缩率大概顶多 50%?
    3dwelcome
        18
    3dwelcome  
       2021-02-17 04:31:48 +08:00 via Android
    @LeeReamond 我这算法就是把 bit 拆分后压缩,很好理解。
    比如你浮点数据都是正数,那么所有符号位的 bit,就全部都是 1 。把连续几万个 1 放一起,压缩后也就几个字节大小。然后依次处理剩下的 31 个 bit 。
    浮点格式里,相近数字变化时,大部分 bit 都是不变的,就是利用这个特性来压缩。
    whileFalse
        19
    whileFalse  
       2021-02-17 09:56:46 +08:00   ❤️ 1
    直接写 txt,然后压缩
    或者二进制后压缩

    没必要自己研究存储算法。一般人研究不过 zip 。如果你不是一般人,那你根本不会提出这个问题。
    zwzmzd
        20
    zwzmzd  
       2021-02-17 10:26:01 +08:00 via iPhone   ❤️ 1
    参考 facebook gorilla 压缩算法,时序数据压缩基本绕不开,而且代码都开源了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1110 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:42 · PVG 02:42 · LAX 10:42 · JFK 13:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.