如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');
文件的方式,但预先分配文件大小更有效吗?
我必须编写一个非常大的数据集,找到它的大小是一项非常重要的任务。
答案 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参数的计算。