我在HDF5文件中有一个相当大的2D数据集(大约1000行x 500000列)。创建数据集使其具有无限可扩展性,因此我可以轻松地向底部添加新行,向右添加新列。但是,偶尔我需要在左侧添加新列......这就是我被困住的地方。是否可以以这种方式扩展现有数据集。我现在知道如何做的唯一方法是基本上加载所有数据并完全重写文件。但是,这似乎效率很低。仅供参考,我正在使用Matlab 2012a和低级别HDF5命令下面的现有创建和列添加代码的示例部分。
基本上我想扩展一下:
1 2 3
4 5 6
7 8 9
To This,无需加载全部文件或重写整个文件。
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);
答案 0 :(得分:1)
即使使用低级HDF5命令也不可能。
唯一的解决方案是昂贵的解决方案:扩展数据集的末尾,移动现有内容,然后在开头添加新数据。
希望你偶尔说“所以性能可能不是这样的问题......”