主要内容

并发读写数据使用的单一或多个读取方(SWMR)

概述

单一/ MATLAB的多个读取方(SWMR)特性®低级HDF5函数接口允许您将数据附加到数据集或覆盖现有的数据,而几个读者进程并发读取新的数据文件。读者和作家的过程可以在同一平台或不同的平台上运行,并且没有之间的通信进程或文件锁定是必要的。

使用SWMR,您必须熟悉HDF5 SWMR编程模型。有关更多信息,请参见HDF5 SWMR文档HDF集团的网站。

请注意

MATLAB版本早于R2021b可能无法读取HDF5文件或创建的对象使用R2021b或更高版本由于文件格式HDF5 1.10版本的变化。HDF5文件创建SWMR访问不兼容的HDF5 1.10版本。因为HDF5库总是向后兼容,MATLAB R2021b后来版本可以阅读和修改HDF5文件或使用任何MATLAB版本创建的对象。

要求和限制

  • 必须位于HDF5文件与SWMR访问一个文件系统,符合可移植操作系统接口(POSIX)写()语义,和作者和读者的过程必须遵循SWMR编程模型。

  • SWMR不支持远程文件的金宝app位置。

  • 你必须遵守SWMR实施范围:

    1. 作家过程允许修改原始数据只能通过现有的数据集:

      • 附加数据沿着无限维度

      • 修改现有的数据

    2. 作者过程不允许:

      • 添加新对象或从文件中删除对象。这些对象包括组、数据集、链接,提交数据类型和属性。

      • 修改或添加任何数据项包含适应可变数据类型(包括字符串数据类型)。

    3. 文件空间回收是不允许的。文件修改的大小由一个SWMR作家可能大于如果non-SWMR作家已经修改了文件。

SWMR要求和限制的更多信息,参见HDF5 SWMR用户指南HDF集团的网站。

使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写访问使用默认属性列表的设置。

      文件标识= 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读访问使用默认属性列表的设置。

      文件标识= H5F.open (myFile, H5F_ACC_RDONLY | H5F_ACC_SWMR_READ ', ' H5P_DEFAULT ');

    2. 刷新数据集在每个读操作使用H5D.refresh

写信给HDF5文件在两个进程读

使用SWMR表面数据写入一个HDF5文件,而一位读者过程记录峰值数据文本文件,另一个情节表面数据。这个示例使用MATLAB生成的数据山峰函数。

这个例子定义了三个功能,writeData,readPlot3D,readLogger,它可以同时运行在一个SWMR-enabled环境。你必须运行writeData之前readPlot3DreadLogger创建HDF5文件,如果不存在。

创建一个作家函数命名writeData将一个二维数组的数据写入一个HDF5文件。

当您创建的文件,设置上下库版本范围“H5F_LIBVER_LATEST”在调用H5P.set_libver_bounds函数。然后,使SWMR写访问文件通过指定国旗“H5F_ACC_SWMR_WRITE”在调用H5F.open函数。

最后,每次写操作使用后刷新数据集H5D.flush

函数writeData(外部)%如果不存在,创建HDF5文件并初始化数据集。如果~存在(数据文件,“文件”)%创建文件访问属性列表,设置库版本旗帜,并创建该文件。faplID = H5P.create (“H5P_FILE_ACCESS”);H5P.set_libver_bounds (faplID“H5F_LIBVER_LATEST”,“H5F_LIBVER_LATEST”);文件标识= H5F.create(数据文件,“H5F_ACC_TRUNC”,“H5P_DEFAULT”,faplID);%创建和编写数据集。datatypeID = H5T.copy (“H5T_NATIVE_DOUBLE”);dataspaceID = h5。create_simple (25 [25], []);datasetID = H5D.create(文件标识,“/峰”datatypeID dataspaceID,“H5P_DEFAULT”);H5D.write (datasetID“H5ML_DEFAULT”,“H5S_ALL”,“H5S_ALL”,“H5P_DEFAULT”南(25));%关闭开放的资源。H5D.close (datasetID);H5S.close (dataspaceID);H5T.close (datatypeID);H5F.close(文件标识);结束%打开HDF5文件支持SWMR写访问和开放的金宝app数据集。文件标识= H5F.open(数据文件,“H5F_ACC_RDWR | H5F_ACC_SWMR_WRITE”,“H5P_DEFAULT”);datasetID = H5D.open(文件标识,“/峰”);%循环Z数据写入文件。t = 0: 0.05: 15 Z = exp (-0.15 * t * sin (10 * t * abs(峰值(25));H5D.write (datasetID“H5ML_DEFAULT”,“H5S_ALL”,“H5S_ALL”,“H5P_DEFAULT”,Z);%刷新数据后的数据集编写。H5D.flush (datasetID);暂停(0.05);结束%关闭开放的资源。H5D.close (datasetID);H5F.close(文件标识);结束

创建一个读者函数命名readPlot3D块数据存储在/峰数据集的输入HDF5文件。

通过指定国旗使SWMR读访问“H5F_ACC_SWMR_READ”在调用H5F.open函数。刷新数据的数据集在每个后续的阅读。

函数readPlot3D(外部)%为SWMR打开HDF5文件读访问和开放的数据集。h5FileID = H5F.open(数据文件,“H5F_ACC_RDONLY | H5F_ACC_SWMR_READ”,“H5P_DEFAULT”);datasetID = H5D.open (h5FileID,“/峰”);%循环读取Z数据从文件和3 d绘图。hSurf = [];t = 0: 0.05: 15阅读之前%刷新数据集。H5D.refresh (datasetID);Z = H5D.read (datasetID“H5ML_DEFAULT”,“H5S_ALL”,“H5S_ALL”,“H5P_DEFAULT”);如果isempty (hSurf)如果不存在%创建曲面图。hSurf =冲浪(Z);zlim ([8]);这一(5 [5]);其他的%更新Z曲面图数据。hSurf。ZData = Z;结束暂停(0.05);结束%接近开放资源H5D.close (datasetID);H5F.close (h5FileID);结束

readPlot3D功能更新每个迭代的情节,导致表面情节类似于下面的一个。

生成的曲面图readPlot3D函数

创建第二个读者函数命名readLogger读取的数据/峰数据和日志数据在一个采样点。

通过指定国旗使SWMR读访问“H5F_ACC_SWMR_READ”在调用H5F.open函数。刷新数据的数据集在每个后续的阅读。

函数readLogger(外部)%与SWMR打开HDF5文件读访问和开放的数据集。h5FileID = H5F.open(数据文件,“H5F_ACC_RDONLY | H5F_ACC_SWMR_READ”,“H5P_DEFAULT”);datasetID = H5D.open (h5FileID,“/峰”);%打开日志文件来保存记录。recordFileID = fopen (“logs.txt”,' w ');流(recordFileID“t, Zpeak \ n”);通过阅读Z %循环数据从文件和记录核心价值。t = 0: 0.05: 15阅读之前%刷新数据集。H5D.refresh (datasetID);Z = H5D.read (datasetID“H5ML_DEFAULT”,“H5S_ALL”,“H5S_ALL”,“H5P_DEFAULT”);idx =圆(大小(Z, 1) / 2);流(recordFileID“% .3f, % .3f \ n”t Z (idx idx));暂停(0.05);结束%关闭开放的资源。H5D.close (datasetID);H5F.close (h5FileID);文件关闭(recordFileID);结束

readLogger函数将样本数据写入一个文本文件命名logs.txt。你也可以试着画中的数据logs.txt得到下图。

情节的样本数据日志。三种输出readLogger函数

另请参阅

|||