主要内容

读和写HDF5数据集使用动态加载的过滤器

HDF5库和文件格式允许使用过滤数据块写入之前或之后他们从磁盘读取。压缩过滤器,例如,可以大大减少数据存储在磁盘上的大小,提高阅读和写作的总体性能HDF5数据集。

HDF5库包含一个小的内部过滤器,和MATLAB®金宝app支持他们中的大多数。虽然这些过滤器的工作相对较好,但他们并不总是提供一个最优的性能改进。出于这个原因,HDF5库和MATLAB支持动态加载的过滤器,一个机制,使加载第三方过滤器在金宝app运行时,将它们添加到过滤管道。使用动态加载的过滤器,安装过滤器插件用于读取数据集使用第三方创建的过滤器,或用于创建和使用第三方编写数据集过滤器。

MATLAB高级和低级接口支持工作流,包括动态加载的过滤器。金宝app你可以阅读HDF5数据集编码使用第三方过滤器通过典型工作流只要必要的过滤器插件可以在您的系统上。

  • 高级接口,h5create金宝app支持两种名称参数用于指定过滤器标识符和参数在创建数据集。

  • 底层接口——底层接口支持更先进的过滤工作流,包括H5P.set_filter添加过滤管道和过滤器H5Z.filter_avail检查是否可用一个过滤器。充分利用底层接口,您必须熟悉HDF5 C API。有关更多信息,请参见HDF5集团网站上的文档动态加载的过滤器

安装过滤器插件

MATLAB支金宝app持三种内部HDF5过滤器:缩小(GZIP),洗牌,Fletcher32。读或写数据集使用第三方过滤器,安装和配置过滤器插件。

  1. 安装相关插件过滤:

    • 在Windows上®Mac——适用于您的操作系统下载并安装插件的二进制文件HDF集团

      安装包过滤器插件的版本的HDF5附带你的MATLAB版本。查询版本的HDF5 MATLAB版本,使用H5.get_libversion

    • 在Linux上®——得到过滤器插件源代码和构建它的版本HDF5附带MATLAB。获取过滤器插件源代码,看看HDF集团——过滤器。或者,您可以使用指令和从源代码构建HDF5导出映射文件构建HDF5过滤器插件MATLAB的答案™,然后建立过滤器插件对你建立HDF5库。

  2. 设置HDF5_PLUGIN_PATH环境变量,使之指向本地安装的插件:

    • 在Windows上,设置环境变量使用系统属性- >高级- >环境变量

    • 在Linux和Mac——设置环境变量从终端开始前MATLAB。

  3. 重启MATLAB。

读数据压缩与第三方过滤器

读一个HDF5与第三方数据集压缩过滤器,在您的系统上安装过滤器插件并设置环境变量。

过滤器的信息关联到一个数据集,使用h5disp函数。例如,过滤信息myFile.h5数据集。的过滤器表明该过滤器是注册的HDF组。如果所需的过滤插件没有安装,MATLAB将抛出一个错误表明过滤器是不可用的。

h5disp (“myFile.h5”,“/ SomeDataset”)
HDF5 myFile。h5数据集的SomeDataset大小:250 x250x181最大容量:250 x250xinf数据类型:H5T_IEEE_F64LE(双)ChunkSize: 250 x250x3过滤器:识别过滤器(H5Z-ZFP-1.0.1 (ZFP-0.5.5) github.com/LLNL/H5Z-ZFP) FillValue: 0.000000

请注意

未被过滤表明HDF5内部过滤器的过滤不是一个(例如,缩小);这并不表明,过滤系统不可用。

一旦安装和配置必要的过滤器插件,你可以用你的典型工作流读HDF5数据集。关于阅读HDF5数据的更多信息,见导入HDF5文件

写数据压缩与第三方过滤器

您可以创建和编写一个HDF5数据集使用高级接口(如h5createh5write(比如)或低级接口H5D.createH5D.write)。写一个数据集和第三方过滤,首先识别过滤ID和参数HDF集团——过滤器页面

例如,创建一个HDF5为时间序列数据集随时间增长的二维数组。使用数据分块,使无限第三维度,并使用一个ZFP过滤器压缩的数据块,如这幅图所示。

时间序列变化的二维数组的随着时间的推移,显示为一个三维图与无限第三维度

  1. 安装ZFP过滤器插件

    首先,检查是否ZFP过滤器在您的系统上可用。

    H5Z.filter_avail (32013)
    ans = 0

    如果函数返回1安装插件,可以在您的系统上。如果它返回0、安装ZFP过滤器插件。

  2. 创建HDF5数据集

    当您创建一个HDF5数据集使用过滤器,过滤器被存储为一个数据集属性的列表。您可以定义一个过滤器使用高级或低级接口。使用过滤器,您必须启用数据分块,因为应用过滤器/块。

    创建一个使用高级HDF5数据集h5create函数。指定使用的块大小ChunkSize名称-值参数。指定使用的过滤器CustomFilterIDCustomFilterParameters名称-值参数。

    N = 250;filterID = 32013;%的ID ZFP过滤器filterParams = [3 3.5 - 2 0 0 0 0 0 0);% ZFP滤波器的参数文件名=“myFile.h5”;数据集=“/数据集”;%删除文件,如果存在重启用干净的文件如果存在(文件名,“文件”删除(文件名);结束%创建数据集与无限维度(无限),组块,%与ZFP压缩。h5create(文件名,数据集(N, N,正),“ChunkSize”(N, N, 4),“CustomFilterID”filterID,“CustomFilterParameters”,filterParams);

    另外,如果你想要更多的控制过滤管道,如添加或更新过滤器,您可以使用底层接口。底层界面功能添加多个过滤器来过滤管道(H5P.set_filter),让过滤器或过滤的信息(H5P.get_filter,H5Z.get_filter_info,H5P.get_filter_by_id更新过滤器),(H5P.modify_filter)和删除过滤器的管道(H5P.remove_filter)。

    例如,创建一个数据集HDF5使用底层接口。指定块大小和过滤器使用H5P.set_chunkH5P.set_filter。你可以从任何块排除过滤器有一个过滤器在编写使用失败H5Z_FLAG_OPTIONAL选择。使用该选项时,过滤不参与管道在任何后续阅读的一部分。错误的第一块有一个过滤器失败,使用H5Z_FLAG_MANDATORY选择。随后的数据没有写。

    N = 250;filterID = 32013;%的ID ZFP过滤器filterParams = [3 3.5 - 2 0 0 0 0 0 0);% ZFP滤波器的参数文件名=“myFile.h5”;数据集=“/数据集”;%删除文件,如果存在重启用干净的文件如果存在(文件名,“文件”删除(文件名);结束%检查ZFP过滤器是可用的断言(H5Z.filter_avail (filterID),“ZFP过滤器(ID % d)不可用。”,filterID);%创建dataspace无限维度(无限)无限= H5ML.get_constant_value (“H5S_UNLIMITED”);dspaceID = H5S.create_simple (3, fliplr ([N, N, 0]), fliplr ([N, N,无限]));%与分块建立数据集创建属性列表和ZFP过滤器dcplID = H5P.create (“H5P_DATASET_CREATE”);H5P.set_chunk (dcplID fliplr ([N, N, 4]));H5P.set_filter (dcplID filterID,“H5Z_FLAG_MANDATORY”,filterParams);%创建文件和数据集文件标识= H5F.create(文件名,“H5F_ACC_TRUNC”,“H5P_DEFAULT”,“H5P_DEFAULT”);dsetID = H5D.create(文件标识,数据集,“H5T_NATIVE_DOUBLE”dcplID dspaceID, [],“H5P_DEFAULT”);%接近开放资源H5D.close (dsetID);H5F.close(文件标识);H5P.close (dcplID);H5S.close (dspaceID);
  3. 写HDF5数据集

    写数据集使用典型的工作流。例如,这个代码写时变数据基于MATLAB山峰函数。的循环创建一个保存数据流情况相似,一个二维数组而时间流。

    • 使用高级接口:

      data0 =山峰(N);抽搐;t = = data0 * cosd 0:180数据(t);h5write(文件名、数据集、数据[1 1 t + 1], [N, N, 1]);结束
      运行时间是1.029668秒。
    • 使用低级的接口:

      data0 =山峰(N);抽搐;文件标识= H5F.open(文件名,“H5F_ACC_RDWR”,“H5P_DEFAULT”);dsetID = H5D.open(文件标识、数据集);t = = data0 * cosd 0:180数据(t);H5D.set_extent (dsetID fliplr ([N, N, t + 1]));dspaceID = H5D.get_space (dsetID);H5S.select_hyperslab (dspaceID“H5S_SELECT_SET”fliplr ([0, 0, t]), [], [], fliplr ([N, N, 1]));memspaceID = H5S.create_simple (3, fliplr ([N, N, 1]), []);H5D.write (dsetID“H5ML_DEFAULT”memspaceID dspaceID,“H5P_DEFAULT”、数据);结束H5S.close (dspaceID);H5D.close (dsetID);H5F.close(文件标识);toc
      运行时间是0.598005秒。

    低级工作流更为有效,因为它只需要打开和关闭文件和数据集,分别之前和之后的循环。在高级工作流,每次执行这些操作h5write被称为。底层接口还允许设置缓存大小的块,这可以提高性能。

  4. 读取和显示HDF5数据集

    你可以阅读HDF5数据集压缩使用动态加载的过滤器和其他数据集,只要相关过滤插件安装和环境变量HDF5_PLUGIN_PATH是集。

    data = h5read(文件名,数据集[1]50,25日,[3、5、2],[50、40、45])
    数据(::1)= 0.0145 0.1045 -3.0375 -5.4901 -0.7706 -0.2130 -0.6894 3.7574 0.1285 2.3196 -0.2966 -2.3229 0.5124 0.4879 2.4735数据(:,:2)= 0.0102 0.0739 -2.1478 -3.8821 -0.5449 -0.1506 -0.4875 2.6569 0.0909 1.6402 -0.2097 -1.6425 0.3623 0.3450 1.7490

另请参阅

|||