Flatbuffers 可以利用向量中的 0 吗?或者其他小波是否比 Haar 变换更好?

Can Flatbuffers take advantage of 0's in vectors? Or are other wavelets better than the Haar transform?

我正在序列化一些数据,并希望在不丢失数据基本细节的情况下使文件大小尽可能小。我的第一步是以二进制格式而不是 ASCII 格式保存数据,我决定尝试 Flatbuffers。以前当数据存储为文本文件时,它们大约为 400 MB。使用如下所示的架构,该文件大约为 200 MB。所以这是一个很好的尺寸减小,但更小当然会更好。数据由1个ControlParams,82个ControlData组成,强度向量占据了space的大部分,是一个大小约为128x5000的矩阵。我们已经达到理论二进制大小 128x5000*82 * 4 字节/浮点数 ~ 200 mb。一般来说,矩阵非常密集,但我可以看到零行。 Flatbuffers 能否利用这些零来进一步减小文件大小?也许有人可以在模式中发现其他低效率,因为我刚刚开始使用 Flatbuffers?

另一种减小文件大小的方法可能是研究不同的小波来压缩原始强度。我现在正在使用 Haar 变换,因为我能够创建一个 C++ 函数来执行此操作,并且发现可以压缩 2 倍或可能 4 倍。我可能想研究其他小波,但想知道其他人是否尝试过与 Haar 不同的小波并发现他们能够使用更少的系数。

namespace RTSerialization;

table ControlParams{
    extractStepSizeDa:float = 1.0005;
    smooth:bool = false;
    haarLevel:int = 10;
    deltaTimeSec:float;
}

table ControlData{
    mzAxis:[float];
    timeSec:[float];
    intensities:[float];
    scanFilter:string;
}

table ControlParamsAndData{
    params:ControlParams;
    dataSet:[ControlData];
}

root_type ControlParamsAndData;

是的,您的大小完全由单个 float 数组决定,FlatBuffer 格式的其余部分与如何使它更小的问题完全无关。

不,FlatBuffers 不进行任何形式的自动压缩,因为设计完全是关于随机访问的。对浮点数组的任何访问都应该是 O(1).

因此,优化这些数据完全取决于您。你说数据是矩阵.. 矩阵中的浮点数通常在-1到1这样的有限范围内,因此可以量化为short?

其他形式的压缩当然意味着您必须自己做 packing/unpacking。