Написание зубчатого массива в HDF5 с использованием собственной библиотеки Java - PullRequest
2 голосов
/ 12 апреля 2019

Я пробовал многочисленные способы и следовал некоторым из примеров, которые разбросаны по сети, о том, как написать зубчатый массив (массив массивов, которые могут иметь различную длину) в 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 Ответ

1 голос
/ 16 апреля 2019

Очевидно, что «клейкий код» оболочки JNI не поддерживает это.Если вы хотите использовать эту функцию, вы должны либо внедрить свой собственный JNI, либо ждать более новой версии.Официальный код JNI с открытым исходным кодом и может быть найден здесь .

...