平面缓冲区可以利用向量中的 0 吗?还是其他小波比哈尔变换更好?

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

本文关键字:其他 小波比 更好 变换 哈尔 缓冲区 向量 平面      更新时间:2023-10-16

我正在序列化一些数据,并希望在不丢失数据基本细节的情况下使文件大小尽可能小。 对我来说,第一步是以二进制格式而不是ASCII保存数据,我决定尝试Flatbuffers。 以前,当数据存储为文本文件时,它们约为 400 MB。 使用下面显示的架构,文件约为 200 MB。 所以这是一个很好的尺寸减小,但越小当然会更好。 数据由 ControlParams 的 1 个、ControlData 的 82 个组成,强度矢量占据了大部分空间,是一个大小约为 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

当然,其他形式的压缩意味着您必须自己打包/拆包。