将多个数据集读/写到单个 HDF5 文件

Posted

技术标签:

【中文标题】将多个数据集读/写到单个 HDF5 文件【英文标题】:Reading/Writing multiple datasets to a single HDF5 file 【发布时间】:2012-03-26 17:55:22 【问题描述】:

我们如何将多个数据集写入单个 HDF5 文件? 同样,如何从同一个文件中重新读取这些数据集?

我正在考虑使用组创建多个数据集。下面的代码试图在组下使用 ScalarDS 创建一个不透明的数据类型,但它会引发异常。

      public static void createFile(Message message)throws Exception  
      // retrieve an instance of H5File
      FileFormat fileFormat = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5); 
      if (fileFormat == null)
      System.err.println("Cannot find HDF5 FileFormat.");
      return;
         
      // create a new file with a given file name.
      H5File testFile = (H5File)fileFormat.create(fname);    
      if (testFile == null)
      System.err.println("Failed to create file:"+fname);
       return;
           
      // open the file and retrieve the root group    
        testFile.open();
        Group root = (Group)((javax.swing.tree.DefaultMutableTreeNode)testFile.getRootNode()).getUserObject();
        Group g1 = testFile.createGroup("byte arrays", root);        
    // obtaining the serialized object   
       byte[] b =serializer.serialize(message);  
       int len=b.length;
       byte[] dset_data = new byte[len+1];
   // Initialize data.
       int indx=0;
       for (int jndx = 0; jndx < len ; jndx++)
       dset_data[jndx] = b[jndx];
       dset_data[len] = (byte)(indx) ;
   // create opaque dataset ---- error here…
       Datatype dtype = testFile.createDatatype(
       Datatype.CLASS_OPAQUE, (len*4), Datatype.NATIVE, Datatype.NATIVE);
       Dataset dataset = testFile.createScalarDS
       ("byte array", g1, dtype, dims1D, null, null, 0, dset_data);//error shown in this line
  // close file resource
     testFile.close();

我不明白为什么它会给我 HDF5 库异常并指向 createScalarDS 行。为什么无法在组下创建不透明数据集?

【问题讨论】:

【参考方案1】:

默认配置不允许,但您可以查看Parallel HDF5,它支持通过 MPI 进行并行写入访问。 但是,这仅适用于未压缩的数据。

【讨论】:

Hii Umit...谢谢您的帮助,但确实存在一个问题.. java 不支持并行 HDF5.. 是否可以在一个组中写入多个数据集?这可以动态完成吗? @kuki 是的 Java 包装器不支持并行 HDF5。可以将多个数据集写入一个组,但只能从一个线程写入 HDF5 文件。但是,您可以从一个线程写入并同时从任何其他线程读取。动态是什么意思? 好吧,在我的程序代码中,我从另一个类中调用这个'public static void rec(Message message)';其中 message 是稍后序列化的 Message 类的对象。消息实际上是用户输入的 JMS 消息。我希望将用户发送的所有消息放到一个 HDF5 文件中,但在不同的不透明数据集下,每条消息都存储在一个数据集中。因为我不知道用户会输入多少个单词,所以我需要全部这些数据集的创建将在运行时发生,具体取决于消息对象包含的字数。 @kuki:我没有使用 HDF5 的 JAVA 包装器,但我建议将您的例外发布到 hdf5 邮件列表(HDF 用户讨论列表 )。他们通常会快速响应此类问题。

以上是关于将多个数据集读/写到单个 HDF5 文件的主要内容,如果未能解决你的问题,请参考以下文章

将浮点数组写入和附加到 C++ 中 hdf5 文件中的唯一数据集

多个 HDF5 文件的 HDF5 数据层定义

编写并将float数组附加到C ++中hdf5文件中的唯一数据集

来自多个 HDF5 文件/数据集的链数据集

如何将 Pandas 数据框写入 HDF5 数据集

将大 csv 转换为 hdf5