【发布时间】:2026-01-19 10:10:01
【问题描述】:
我在 HDF5 文件中有一个相当大的 2D 数据集(大约 1000 行 x 500000 列)。创建了数据集,因此它可以无限扩展,因此我可以轻松地在底部添加新行,在右侧添加新列。但是,有时我需要在左侧添加新列......这就是我卡住的地方。是否可以通过这种方式扩展现有数据集。我现在知道该怎么做的唯一方法基本上是加载所有数据并完全重写文件。但是,这似乎非常低效。仅供参考,我正在使用 Matlab 2012a 和低级 HDF5 命令现有创建的示例部分和下面的列添加代码。
基本上我想扩展这个:
1 2 3
4 5 6
7 8 9
无需加载全部或重写整个文件。
NaN 1 2 3
NaN 4 5 6
NaN 7 8 9
带有传入数据的创建代码示例代码片段:
case 'create'
data = varargin{1};
% ---------- Data Info ----------
dims = fliplr(size(data)); %flip due to H5 indexing order
% ---------- Create Initial HDF5 File ----------
fileID = H5F.create(filename, 'H5F_ACC_TRUNC', 'H5P_DEFAULT', 'H5P_DEFAULT');
% Create dataspace with unlimited dimensions.
datatypeID = H5T.copy('H5T_NATIVE_DOUBLE');
maxdims = {'H5S_UNLIMITED', 'H5S_UNLIMITED'};
spaceID = H5S.create_simple (2, dims, maxdims);
% ---------- Create the dataset property list, add gzip, set chunk
chunk = [1024 1];
propID = H5P.create('H5P_DATASET_CREATE');
H5P.set_deflate(propID, 5);
H5P.set_chunk(propID, chunk);
H5P.set_fill_value(propID,datatypeID,NaN); %Fill with NaNs on creation
% ---------- Create the compressed unlimited dataset.
datasetID = H5D.create(fileID, dataName,datatypeID, spaceID, propID);
% ---------- Write the data to the dataset.
H5D.write(datasetID, datatypeID,'H5S_ALL', 'H5S_ALL','H5P_DEFAULT', data);
% ---------- Close
H5P.close(propID);
H5D.close(datasetID);
H5S.close(spaceID);
H5F.close(fileID);
在右侧添加列的示例...可以将其添加到左侧吗?
case 'addColumns'
c2Add = varargin{1}; %# of columns to add
prevH5Info = h5info(filename);
newdims(1) = prevH5Info.Datasets.Dataspace.Size(1);
newdims(2) = prevH5Info.Datasets.Dataspace.Size(2)+c2Add;
newdims = fliplr(newdims); %flip due to H5 indexing order
fileID = H5F.open(filename, 'H5F_ACC_RDWR', 'H5P_DEFAULT');
datasetID = H5D.open(fileID, dataName);
% ---------- Get Data Space and Extend Existing Dimensions
H5D.extend(datasetID, newdims);
% ---------- Close
H5D.close(datasetID);
H5F.close(fileID);
【问题讨论】: