Читайте и запись данных Одновременно Используя Single-Writer/Multiple-Reader (SWMR)

Обзор

Single-Writer/Multiple-Reader (SWMR) функция MATLAB® низкоуровневый HDF5 интерфейс функции позволяет вам добавлять данные к наборам данных или перезаписывать существующие данные, в то время как несколько процессов читателя одновременно считывают новые данные из файла. Процессы читателя и средства записи могут работать на той же платформе или других платформах, и никакая связь между процессами или захватом файла не необходима.

Чтобы использовать SWMR, необходимо быть знакомы с моделью программирования HDF5 SWMR. Для получения дополнительной информации см. Документацию HDF5 SWMR относительно веб-сайта HDF Group.

Примечание

MATLAB выпускает ранее, чем сила R2021b не смочь считать файлы HDF5 или объекты создала использование, R2021b из-за изменений формата файла в файлах версии 1.10. HDF5 HDF5, созданных с доступом SWMR, не совместимы с версиями HDF5 до 1,10. Поскольку библиотека HDF5 всегда обратно совместима, MATLAB R2021b может считать и изменить файлы HDF5 или объекты, созданные с помощью предыдущих версий MATLAB.

Включите доступ SWMR для файла HDF5

Выполните эти общие шаги в MATLAB, чтобы включить доступ SWMR в на файле HDF5:

  1. Создайте файл с последним форматом файла путем определения нижних и верхних границ версии библиотеки как 'H5F_LIBVER_LATEST' в вызове H5P.set_libver_bounds функция.

    H5P.set_libver_bounds(faplID,'H5F_LIBVER_LATEST','H5F_LIBVER_LATEST');
    

  2. Включите доступ для записи SWMR для файла HDF5 и сбросьте набор данных после каждой операции записи.

    1. Задайте флаг 'H5F_ACC_SWMR_WRITE' в вызове H5F.open функция. Например, откройте файл с доступом для записи SWMR с помощью настроек списка свойств по умолчанию.

      fileID = H5F.open(myFile,'H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE','H5P_DEFAULT');
      

      В качестве альтернативы можно включить доступ для записи SWMR с помощью H5F.start_swmr_write функция.

    2. Сбросьте набор данных после каждой операции записи с помощью H5D.flush.

  3. Включите доступ для чтения SWMR для файла HDF5 и обновите набор данных перед каждой операцией чтения.

    1. Откройте файл для доступа для чтения SWMR путем определения флага 'H5F_ACC_SWMR_READ' в вызове H5F.open функция. Например, откройте файл с доступом для чтения SWMR с помощью настроек списка свойств по умолчанию.

      fileID = H5F.open(myFile,'H5F_ACC_RDONLY|H5F_ACC_SWMR_READ','H5P_DEFAULT');
      

    2. Обновите набор данных перед каждой операцией чтения с помощью H5D.refresh.

Запишите в файл HDF5 в то время как два чтения процессов

Используйте SWMR, чтобы записать поверхностные данные в файл HDF5, в то время как один читатель обрабатывает данные о пике записей в текстовом файле, и другой отображает поверхностные данные на графике в зависимости от времени. Этот пример использует данные, сгенерированные от peaks MATLAB функция.

Этот пример задает три функции, writeData, readPlot3D, и readLogger, который может быть запущен одновременно в SWMR-поддерживающей среде. Необходимо запустить writeData перед readPlot3D и readLogger создать файл HDF5, если это не существует.

Создайте функцию с именем средства записи writeData это пишет 2D массив данных к файлу HDF5.

Когда вы создаете файл, устанавливаете более низкие и верхние границы версии библиотеки на 'H5F_LIBVER_LATEST' в вызове H5P.set_libver_bounds функция. Затем включите доступ для записи SWMR к файлу путем определения флага 'H5F_ACC_SWMR_WRITE' в вызове H5F.open функция.

Наконец, сбросьте набор данных после каждой операции записи с помощью H5D.flush.

function writeData(dataFile)
    % Create HDF5 file if does not already exist, and initialize dataset.
    if ~exist(dataFile,'file')
        % Create file access property list, set library version flags, and create the file.
        faplID = H5P.create('H5P_FILE_ACCESS');
        H5P.set_libver_bounds(faplID,'H5F_LIBVER_LATEST','H5F_LIBVER_LATEST');
        fileID = H5F.create(dataFile,'H5F_ACC_TRUNC','H5P_DEFAULT',faplID);
    
        % Create and write dataset.
        datatypeID = H5T.copy('H5T_NATIVE_DOUBLE');
        dataspaceID = H5S.create_simple(2,[25 25],[]);
        datasetID = H5D.create(fileID,'/peaks',datatypeID,dataspaceID,'H5P_DEFAULT');
        H5D.write(datasetID,'H5ML_DEFAULT','H5S_ALL','H5S_ALL','H5P_DEFAULT',NaN(25));

        % Close open resources.
        H5D.close(datasetID);
        H5S.close(dataspaceID);
        H5T.close(datatypeID);
        H5F.close(fileID);
    end

    % Open HDF5 file with support for SWMR write access and open dataset.
    fileID = H5F.open(dataFile,'H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE','H5P_DEFAULT');
    datasetID = H5D.open(fileID,'/peaks');
    
    % Loop through writing Z data to file.
    for t = 0 : 0.05 : 15
        Z = exp(-0.15*t) * sin(10*t) * abs(peaks(25));
        H5D.write(datasetID,'H5ML_DEFAULT','H5S_ALL','H5S_ALL','H5P_DEFAULT',Z);
        
        % Flush data in the dataset after writing.
        H5D.flush(datasetID);
        pause(0.05);
    end

    % Close open resources.
    H5D.close(datasetID);
    H5F.close(fileID);

end

Создайте функцию с именем читателя readPlot3D это отображает на графике данные, хранимые в /peaks набор данных файла входа HDF5.

Включите доступ для чтения SWMR путем определения флага 'H5F_ACC_SWMR_READ' в вызове H5F.open функция. Обновите данные в наборе данных перед каждым последующим чтением.

function readPlot3D(dataFile)
    % Open HDF5 file with for SWMR read access and open dataset.
    h5FileID = H5F.open(dataFile,'H5F_ACC_RDONLY|H5F_ACC_SWMR_READ','H5P_DEFAULT');
    datasetID = H5D.open(h5FileID,'/peaks');
    
    % Loop through reading Z data from file and 3D plotting it.
    hSurf = [];
    for t = 0 : 0.05 : 15
        % Refresh dataset before reading.
        H5D.refresh(datasetID);
        Z = H5D.read(datasetID,'H5ML_DEFAULT','H5S_ALL','H5S_ALL','H5P_DEFAULT');
        if isempty(hSurf)      
            % Create surface plot if not present.
            hSurf = surf(Z);
            zlim([-8 8]);
            caxis([-5 5]);
        else               
            % Update surface plot Z data otherwise.
            hSurf.ZData = Z;
        end
        pause(0.05);
    end
    
    % Close open resources
    H5D.close(datasetID);
    H5F.close(h5FileID);
end

readPlot3D функционируйте обновляет график с каждой итерацией, приводящей к объемной поверхностной диаграмме, похожей на следующую.

Создайте вторую функцию с именем читателя readLogger это считывает данные в /peaks набор данных и регистрирует данные, взятые в одной точке выборки.

Включите доступ для чтения SWMR путем определения флага 'H5F_ACC_SWMR_READ' в вызове H5F.open функция. Обновите данные в наборе данных перед каждым последующим чтением.

function readLogger(dataFile)
    % Open HDF5 file with SWMR read access and open dataset.
    h5FileID = H5F.open(dataFile,'H5F_ACC_RDONLY|H5F_ACC_SWMR_READ','H5P_DEFAULT');
    datasetID = H5D.open(h5FileID,'/peaks');
    
    % Open log file for saving records.
    recordFileID = fopen('logs.txt','w');
    fprintf(recordFileID,'t,Zpeak\n');
    
    % Loop through reading Z data from the file and recording central value.
    for t = 0 : 0.05 : 15
        % Refresh dataset before reading.
        H5D.refresh(datasetID);
        Z = H5D.read(datasetID,'H5ML_DEFAULT','H5S_ALL','H5S_ALL','H5P_DEFAULT');
        idx = round(size(Z,1)/2);
        fprintf(recordFileID,'%.3f,%.3f\n',t,Z(idx,idx));
        pause(0.05);
    end
    
    % Close open resources.
    H5D.close(datasetID);
    H5F.close(h5FileID);
    fclose(recordFileID);
end

readLogger функция записывает данные выборки к текстовому файлу под названием logs.txt. Можно отобразить данные на графике в logs.txt получить следующую фигуру.

Требования и ограничения

  • Файл HDF5 с доступом SWMR должен быть расположен в файловой системе, которая выполняет Интерфейс Переносимой информационной системы (POSIX) запись () семантика, и процессы средства записи и читателя должны следовать за моделью программирования SWMR.

  • SWMR не поддерживается на удаленном расположении файлов.

Для получения дополнительной информации о требованиях SWMR и ограничениях, см. Руководство пользователя HDF5 SWMR на веб-сайте HDF Group.

Смотрите также

| | |

Для просмотра документации необходимо авторизоваться на сайте