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文件的效率的主要内容,如果未能解决你的问题,请参考以下文章