在 Matlab 中使用 HDF5/H5 优化压缩
Optimizing compression using HDF5/H5 in Matlab
我将使用 Matlab 生成几个数据文件并将它们以 H5 格式存储为 20x1500xN
,其中 N 是一个可以变化的整数,但通常在 2300 左右。每个文件将有 4 个不同的数据具有相同结构的集合。因此,我将快速解决存储问题。我的两个问题:
有什么理由不拆分4个不同的数据集,而是另存为4x20x1500xN
?我更喜欢将它们分开,因为它是不同的信号模式,但如果不将它们分开有任何 computational/compression 优势,我会加入它们。
使用 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 的速度。 .. 所以微调总是需要一些实验。
我将使用 Matlab 生成几个数据文件并将它们以 H5 格式存储为 20x1500xN
,其中 N 是一个可以变化的整数,但通常在 2300 左右。每个文件将有 4 个不同的数据具有相同结构的集合。因此,我将快速解决存储问题。我的两个问题:
有什么理由不拆分4个不同的数据集,而是另存为
4x20x1500xN
?我更喜欢将它们分开,因为它是不同的信号模式,但如果不将它们分开有任何 computational/compression 优势,我会加入它们。使用 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 的速度。 .. 所以微调总是需要一些实验。