【问题标题】:Extend an HDF5 dataset in a negative direction向负方向扩展 HDF5 数据集
【发布时间】: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);

【问题讨论】:

    标签: matlab hdf5


    【解决方案1】:

    不,即使使用低级 HDF5 命令也是不可能的。

    唯一的解决方案是昂贵的:扩展数据集的末尾,移动现有内容,然后在开头添加新数据。

    希望你说的是“偶尔”,所以性能可能不是这样的问题……

    【讨论】:

    • 感谢您的回复。我害怕这会是答案。是的,它应该不常见,但我希望尽可能避免它。我能想到的唯一其他解决方案是将新的“左侧”列附加到右侧,但保留某种包含正确顺序的跟踪数组。所以在追加之后,我的 trackin 数组看起来像 [2 3 4 1] 意味着最后一列确实是第一列......但是在多次追加后这可能会变得很难看。还是谢谢!