在 Matlab 中使用 HDF5/H5 优化压缩

Optimizing compression using HDF5/H5 in Matlab

我将使用 Matlab 生成几个数据文件并将它们以 H5 格式存储为 20x1500xN,其中 N 是一个可以变化的整数,但通常在 2300 左右。每个文件将有 4 个不同的数据具有相同结构的集合。因此,我将快速解决存储问题。我的两个问题:

  1. 有什么理由不拆分4个不同的数据集,而是另存为4x20x1500xN?我更喜欢将它们分开,因为它是不同的信号模式,但如果不将它们分开有任何 computational/compression 优势,我会加入它们。

  2. 使用 Matlab 的内置压缩,我设置了 deflate=9(和 DataType=single)。但是,我现在已经意识到使用 deflate 会使我的计算时间乘以 5。我意识到这可能与我的 ChunkSize 有关,我只是把它放在 20x1500x5 - 没有任何推理在它后面。是否有优化计算负载的战略方法 w.r.t。放气压缩时间?

谢谢。

1- 拆分还是合并?它不会对压缩过程产生影响,因为它是按块执行的。

2- 你选择的 chunkshape 看起来确实很糟糕。 Chunksize 确定将被独立压缩的每个块的形状和大小。不好的是每个块有 600 kB,比 L2 缓存大得多,所以你的 CPU 很可能在玩弄它的手指,等待数据进来。取决于你的数据的性质和用途您将使用最多的模式(一次读取整个数组、随机读取、顺序读取...)您可能希望以 L1 或 L2 大小或介于两者之间的大小为目标。 Here 是使用 Python 库完成的一些实验,可以作为指导。

一旦你选择了你的块大小(你的压缩块有多少字节),你必须选择一个块形状。如果您正在进行部分读取,我会推荐最适合您的阅读模式的形状,或者如果您想一次读取整个数组,请先填充最快的轴。在你的情况下,这将类似于 1x1500x10,我认为(第二个轴是最快的,最后一个是第二快的,拳头是最慢的,如果我弄错了就改变)。

最后,请记住,细节在很大程度上取决于您 运行 它的特定机器:CPU、硬盘驱动器或 SSD 的质量和负载、RAM 的速度。 .. 所以微调总是需要一些实验。