无限hdf5文件在MATLAB中的效率

Efficiency of the unlimited hdf5 files in MATLAB

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 documentation 中解释了数据的存储方式,这里是它的简短引用。

For chunked storage, the data is stored in one or more chunks. Each chunk is a continuous block in the file, but chunks are not necessarily stored contiguously. Each chunk has the same size. The data array has the same nominal size as a contiguous array (number of elements x size of element), but the storage is allo­cated in chunks, so the total size in the file can be larger that the nominal size of the array. See the figure below.

没有像 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

命令window的打印输出如下:

正在写入有限文件:已用时间为 1.924045 秒。

正在写入无限文件:已用时间为 11.809602 秒。

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