Расширение набора данных HDF5 в отрицательном направлении

У меня есть довольно большой набор 2D-данных (примерно 1000 строк x 500000 столбцов) в файле HDF5. Набор данных был создан таким образом, что его можно бесконечно расширять, поэтому я могу легко добавлять новые строки внизу и новые столбцы справа. Однако иногда мне нужно добавить новые столбцы в левую часть... и именно здесь я застрял. Можно ли таким образом расширить существующий набор данных. Единственный способ, который я знаю, как это сделать сейчас, это загрузить все данные и полностью переписать файл. Однако это кажется очень неэффективным. К вашему сведению, я использую 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);

person Aero Engy    schedule 15.12.2014    source источник


Ответы (1)


Нет, это невозможно даже с низкоуровневыми командами HDF5.

Единственное дорогое решение: расширить конец набора данных, переместить существующий контент, а затем добавить новые данные в начале.

Надеюсь, вы сказали «иногда», так что производительность может не быть такой проблемой…

person Simon    schedule 15.12.2014
comment
Спасибо за ответ. Я боялся, что это будет ответ. Да, это должно быть нечасто, но я надеялся избежать этого, если это возможно. Единственное другое решение, которое я мог придумать, заключалось в том, чтобы в любом случае добавить новые левые столбцы к правой стороне, но сохранить какой-то массив отслеживания, который содержал правильный порядок. Таким образом, после добавления мой массив отслеживания будет выглядеть как [2 3 4 1], что означает, что последний столбец был действительно первым... однако это может стать некрасивым после нескольких добавлений. Спасибо, в любом случае! - person Aero Engy; 15.12.2014