MATLAB中无限hdf5文件的效率

时间:2016-02-01 12:12:16

标签: matlab dataset hdf5

official MATLAB documentation的示例所示,可以使用以下代码写入无限function nthParent(element, n) { while(n-- && element) element = element.parentNode; return element; } 文件:

hdf5

我不熟悉MATLAB处理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'); 文件的方式,但预先分配文件大小更有效吗?

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

1 个答案:

答案 0 :(得分:0)

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

答案很长: 数据的存储方式在hdf5 documentation中有解释,这里有一个简短的引用。

  

对于分块存储,数据存储在一个或多个块中。每   chunk是文件中的连续块,但块不是   必须连续存储。每个块都具有相同的大小。该   数据数组具有与连续数组相同的标称大小(数量为   元素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中用于定义chunck参数的计算。