使用 Java Native Library 在 HDF5 中编写交错数组

Posted

技术标签:

【中文标题】使用 Java Native Library 在 HDF5 中编写交错数组【英文标题】:Writing a Jagged Array in HDF5 using the Java Native Library 【发布时间】:2019-09-03 14:04:18 【问题描述】:

我尝试了很多方法,并遵循了一些散布在网络上的示例,了解如何在 HDF5 中编写锯齿状数组(可能具有不同长度的数组的数组)。

大多数示例都是用 C 语言编写的,而且相当低级。无论如何,我似乎无法让它工作,我只是查看了 C 源代码,它几乎说不支持任何不是字符串的可变长度数据类型(如果我理解正确的话)。

我悲惨的功能失调代码(原样):

 public void WIP_createVLenFloatDataSet( List<? extends Number> floats ) throws Exception
  
    String group = "/test";
    long groupId = createGroupIfNotExist( group );
    MDataQualifier qualifier = new MDataQualifierImpl( group, "float", "0.0.0" );
    long datasetId = openDataSet( qualifier );
    long heapType = H5.H5Tcopy( MDataType.FLOAT_ARRAY.getHDFType() );
    heapType = H5.H5Tvlen_create( heapType );
//    heapType = H5.H5Tarray_create( heapType, 1, new long[]1 );
    if( !exists( datasetId ) )
    

      long[] maxDims = new long[] HDF5Constants.H5S_UNLIMITED ;
      long dataspaceId = H5.H5Screate_simple( 1, new long[] 1 , null );
      // Create the dataset.
      long datasetId1 = -1;
      try
      
        if( exists( m_fileId ) && exists( dataspaceId ) && exists( heapType ) )
        
          long creationProperties = H5.H5Pcreate( HDF5Constants.H5P_DATASET_CREATE );
          H5.H5Pset_chunk( creationProperties, /*ndims*/1, new long[] 1  );
          datasetId1 = H5.H5Dcreate( groupId, qualifier.getVersionedName(), heapType, dataspaceId, H5P_DEFAULT, creationProperties, H5P_DEFAULT );
          //          H5.H5Pclose( creationProperties );
        
      
      catch( Exception e )
      
        LOG.error( "Problems creating the dataset: " + e.getMessage(), e );
      
      datasetId = datasetId1;
      if( exists( datasetId ) )
      
        //        flushIfNecessary();
        LOG.trace( "Wrote empty dataset ", qualifier.getVersionedName() );
      
    
    List<? extends Number> data = ( List<? extends Number> )floats;
    //              H5.H5Dwrite( datasetId, heapType, dataspaceId, memSpaceId, HDF5Constants.H5P_DEFAULT, Floats.toArray( data) );
    ByteBuffer bb = ByteBuffer.allocate( data.size() * 4 );
    floats.forEach( f -> bb.putFloat( f.floatValue() ) );
//    H5.H5Dwrite( datasetId, heapType, H5S_ALL, H5S_ALL, H5P_DEFAULT, Floats.toArray( data ) );
    H5.H5Dwrite( datasetId, heapType, H5S_ALL, H5S_ALL, H5P_DEFAULT, bb.array() );

  

以前有没有人这样做过并且至少可以确认这是不可能的? 我能从 HDF5 中得到的最多的是消息“buf 不支持可变长度类型”。

【问题讨论】:

【参考方案1】:

显然,JNI 包装器的“粘合代码”不支持这一点。如果你想使用这个特性,你要么必须实现自己的 JNI,要么等待更新的版本。官方JNI代码是开源的,可以在here找到。

【讨论】:

以上是关于使用 Java Native Library 在 HDF5 中编写交错数组的主要内容,如果未能解决你的问题,请参考以下文章

Realm Java作为Native Android Library的依赖绑定到Xamarin

Java调用R环境配置问题:Cannot find JRI native library!

找不到合适的本地库。 native.libpath。* vs java.library.path

NativeBase 内容未在 Jest 中使用 react-native-testing-library 呈现

react-native-testing-library:如何使用 act 测试 useEffect

The APR based Apache Tomcat Native library which allows optimal performance in production environmen