MATLAB中无限hdf5文件的效率

Posted

技术标签:

【中文标题】MATLAB中无限hdf5文件的效率【英文标题】:Efficiency of the unlimited hdf5 files in MATLAB 【发布时间】:2016-05-09 21:15:50 【问题描述】:

如official MATLAB documentation 的示例所示,可以使用以下代码写入无限的hdf5 文件:

h5create('myfile.h5','/DS3',[20 Inf],'ChunkSize',[5 5]);

for j = 1:10
      data = j*ones(20,1);
      start = [1 j];
      count = [20 1];
      h5write('myfile.h5','/DS3',data,start,count);
end
h5disp('myfile.h5');

我不熟悉 MATLAB 处理 hdf5 文件的方式,但预先分配文件大小是否更有效?

我必须编写一个非常大的数据集,并且要找到它的大小是一项艰巨的任务。

【问题讨论】:

你试过测试吗?在 hdf5 文件中写入转储而不告诉它大小并告诉它,并计时! 我正在努力,但有时根据数据的大小,您可以获得各种时间。我在了解其中发生的事情之后。我打算让它运行到明天,看看会发生什么。 save 命令包含在您的比较中。它使用-v7.3 格式写入一个gzip 压缩的HDF5 文件。这可能是最快的选择。 【参考方案1】:

简答: 写入有限文件比在无限文件中写入相同数量的数据要快。但是,在使用无限文件时没有动态重新分配整个文件,写入数据仍然相当快。

长答案: 数据的存储方式在hdf5 documentation 中有说明,这里是它的简短引用。

对于分块存储,数据存储在一个或多个块中。每个 块是文件中的连续块,但块不是 必须连续存储。每个块具有相同的大小。这 数据数组具有与连续数组相同的标称大小( 元素 x 元素大小),但存储是按块分配的, 因此文件中的总大小可以大于标称大小 数组。见下图。

没有像 Daniel 引用的那样使用任何优化,我尝试使用以下代码编写一个包含 200 MB 数据的虚拟文件:

不使用无限大小:

h5create('train.h5','/data',[size_x size_y 3 length(label)]);
h5create('train.h5','/label',[1 length(label)]);

tic
h5write('train.h5','/data', data)
h5write('train.h5','/label', label)
fprintf('Writing finite file :')
toc

使用无限大小:

h5create('train.h5','/data',[size_x size_y 3 Inf],'ChunkSize',[size_x size_y 3 56]);
h5create('train.h5','/label',[1 Inf],'ChunkSize',[1 56]);
tic
for ii = 1:round(length(data)/56)
    data_info = h5info('train.h5');
    data_start = [1, 1, 1, data_info.Datasets(1).Dataspace.Size(end)+1];
    data_count = [size_x, size_y, 3, 56];
    label_start = [1, data_info.Datasets(1).Dataspace.Size(end)+1];
    label_count = [1, 56];
    h5write('train.h5', '/data', data(:, :, :, (ii-1)*56+1:ii*56), data_start, data_count);
    h5write('train.h5', '/label', label((ii-1)*56+1:ii*56), label_start, label_count);
end
fprintf('Writing infinite file :')
toc

命令窗口的打印输出如下:

写入有限文件:经过的时间是 1.924045 秒。

写入无限文件:经过的时间是 11.809602 秒。

时间差的一个可能解释来自于在 Matlab 中定义块参数的计算。

【讨论】:

以上是关于MATLAB中无限hdf5文件的效率的主要内容,如果未能解决你的问题,请参考以下文章

连接大量 HDF5 文件

保存 Matlab 对象实例会导致无限循环

Matlab GUI中的无限循环导致关闭GUI时Matlab冻结?

MATLAB作业选登-无限弱化的图像识别拼接程序

断言无限长度的一维双数组(matlab编码器)

通过MATLAB将矩阵数据写入HDF5文件中的每个数据类型成员