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.
Выполните эти общие шаги в MATLAB, чтобы включить доступ SWMR в на файле HDF5:
Создайте файл с последним форматом файла путем определения нижних и верхних границ версии библиотеки как 'H5F_LIBVER_LATEST'
в вызове H5P.set_libver_bounds
функция.
H5P.set_libver_bounds(faplID,'H5F_LIBVER_LATEST','H5F_LIBVER_LATEST');
Включите доступ для записи SWMR для файла HDF5 и сбросьте набор данных после каждой операции записи.
Задайте флаг '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
функция.
Сбросьте набор данных после каждой операции записи с помощью H5D.flush
.
Включите доступ для чтения SWMR для файла HDF5 и обновите набор данных перед каждой операцией чтения.
Откройте файл для доступа для чтения SWMR путем определения флага 'H5F_ACC_SWMR_READ'
в вызове H5F.open
функция. Например, откройте файл с доступом для чтения SWMR с помощью настроек списка свойств по умолчанию.
fileID = H5F.open(myFile,'H5F_ACC_RDONLY|H5F_ACC_SWMR_READ','H5P_DEFAULT');
Обновите набор данных перед каждой операцией чтения с помощью H5D.refresh
.
Используйте 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.
Работа с виртуальными наборами данных HDF5 (VDS) | Свойство (H5P) | Набор данных (H5D) | Файл (H5F)