2016-03-14 92 views
0

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

  1. 有什么理由不分割的4个不同的数据集,并只保存为4x20x1500xN呢?我宁愿让它们分裂,因为它是不同的信号形式,但是如果有任何计算/压缩优势而不让它们分离,我会加入它们。

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

谢谢。

+1

比较你用'save('example.mat','yourdata',' - v7.3')'得到的性能和文件大小。它写了一个gip压缩HDF5,根据我的经验,在速度和压缩之间有一个很好的折中。意识到我直接停止使用hdf5库。 – Daniel

+0

@Daniel事情是我要用parfor循环写入这个文件,这就是我选择使用H5的原因。 –

+0

没有理由不使用保存在上下文中:http://www.mathworks.com/matlabcentral/answers/135285-how-do-i-use-save-with-a-parfor-loop-using-parallel -computing-toolbox – Daniel

回答

1

1-拆分或合并?它在压缩过程中不会产生影响,因为它是以块的形式执行的。

2-你的选择似乎确实很糟糕。块大小决定了将被独立压缩的每个块的形状和大小。不好的一面是每块大小都是600 kB,比L2高速缓存大得多,所以你的CPU可能会扭曲它的手指,等待数据进入。根据数据的性质和使用模式,你将使用大多数(一次读取整个数组,随机读取,连续读取...),您可能需要定位L1或L2大小,或者介于两者之间。 Here是一些使用Python库进行的实验,可以为您提供指导。

一旦你选择了块大小(你的压缩块有多少个字节),你必须选择一个块形。如果您要进行部分读取,或者如果想要一次读取整个阵列,则我会推荐最接近您的阅读模式的形状,如果您正在进行部分读取,或者填写速度最快的轴。在你的情况下,这将是类似于1x1500x10,我认为(第二轴是最快的,最后一个是最快的,最慢的,如果我错了,改变)。

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

+0

非常感谢你的一个启发性帖子。绝对可用。 –