Escribir y agregar matrices de float al único conjunto de datos en el archivo hdf5 en C ++

Estoy procesando el número de archivos, cada procesamiento del archivo generará varios miles de arreglos de flotadores y lo haréalmacene los datos de todos los archivos en un gran conjunto de datos en un solo hdf5 para su posterior procesamiento.

Actualmente, estoy confundido acerca de cómo agregar mis datos al archivo hdf5. (comente en el código anterior) En 2 para los bucles anteriores, como puede ver, quiero agregar una matriz dimensional de flotación en hdf5 a la vez, y no como toda la cosa. Mis datos están en terabytes y solo podemos agregar los datos al archivo.

Hay varias preguntas:

¿Cómo anexar los datos en este caso? ¿Qué tipo de función debo usar?En este momento, tengo fdim [0] = 928347543, he intentado poner la bandera infinita de HDF5 en, pero la ejecución en tiempo de ejecución se queja. ¿Hay alguna forma de hacer esto? No quiero calcular los datos que tengo cada vez; ¿hay una manera de simplemente seguir agregando datos, sin importar el valor de fdim?

O esto no es posible?

EDITAR:

He estado siguiendo la sugerencia de Simon, y actualmente aquí está mi código actualizado:

hid_t desFi5;
hid_t fid1;
hid_t propList;
hsize_t fdim[2];

desFi5 = H5Fcreate(saveFilePath, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

fdim[0] = 3;
fdim[1] = 1;//H5S_UNLIMITED;

fid1 = H5Screate_simple(2, fdim, NULL);

cout << "----------------------------------Space done\n";

propList = H5Pcreate( H5P_DATASET_CREATE);

H5Pset_layout( propList, H5D_CHUNKED );

int ndims = 2;
hsize_t chunk_dims[2];
chunk_dims[0] = 3;
chunk_dims[1] = 1;

H5Pset_chunk( propList, ndims, chunk_dims );

cout << "----------------------------------Property done\n";

hid_t dataset1 = H5Dcreate( desFi5, "des", H5T_NATIVE_FLOAT, fid1, H5P_DEFAULT, propList, H5P_DEFAULT);

cout << "----------------------------------Dataset done\n";

bufi = new float*[1];
bufi[0] = new float[3];
bufi[0][0] = 0;
bufi[0][1] = 1;
bufi[0][2] = 2;

//hyperslab
hsize_t start[2] = {0,0};
hsize_t stride[2] = {1,1};
hsize_t count[2] = {1,1};
hsize_t block[2] = {1,3};

H5Sselect_hyperslab( fid1, H5S_SELECT_OR, start, stride, count, block);     
cout << "----------------------------------hyperslab done\n";   

H5Dwrite(dataset1, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, *bufi);

fdim[0] = 3;
fdim[1] = H5S_UNLIMITED;    // COMPLAINS HERE
H5Dset_extent( dataset1, fdim );

cout << "----------------------------------extent done\n";

//hyperslab2
hsize_t start2[2] = {1,0};
hsize_t stride2[2] = {1,1};
hsize_t count2[2] = {1,1};
hsize_t block2[2] = {1,3};

H5Sselect_hyperslab( fid1, H5S_SELECT_OR, start2, stride2, count2, block2);     
cout << "----------------------------------hyperslab2 done\n";  

H5Dwrite(dataset1, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, *bufi);

cout << "----------------------------------H5Dwrite done\n";        
H5Dclose(dataset1);
cout << "----------------------------------dataset closed\n";   
H5Pclose( propList );   
cout << "----------------------------------property list closed\n"; 
H5Sclose(fid1); 
cout << "----------------------------------dataspace fid1 closed\n";    
H5Fclose(desFi5);       
cout << "----------------------------------desFi5 closed\n";    

Mi salida actual es:

bash-3.2$ ./hdf5AppendTest.out
----------------------------------Space done
----------------------------------Property done
----------------------------------Dataset done
----------------------------------hyperslab done
HDF5-DIAG: Error detected in HDF5 (1.8.10) thread 0:
  #000: /home/hdftest/snapshots-bin-hdf5_1_8_10/current/src/H5D.c line 1103 in H5Dset_extent(): unable to set extend dataset
    major: Dataset
    minor: Unable to initialize object
  #001: /home/hdftest/snapshots-bin-hdf5_1_8_10/current/src/H5Dint.c line 2179 in H5D__set_extent(): unable to modify size of data space
    major: Dataset
    minor: Unable to initialize object
  #002: /home/hdftest/snapshots-bin-hdf5_1_8_10/current/src/H5S.c line 1874 in H5S_set_extent(): dimension cannot exceed the existing maximal size (new: 18446744073709551615 max: 1)
    major: Dataspace
    minor: Bad value
----------------------------------extent done
----------------------------------hyperslab2 done
----------------------------------H5Dwrite done
----------------------------------dataset closed
----------------------------------property list closed
----------------------------------dataspace fid1 closed
----------------------------------desFi5 closed

Actualmente, veo que configurar cosas en ilimitado con H5Dset_extent todavía causa un problema durante el tiempo de ejecución. (La función problemática está marcada con//COMPLAINS HERE en el código anterior.) Ya obtuve una parte de los datos especificados por Simon, ¿cuál es el problema aquí?

Por otro lado, sin H5Dset_extent, puedo escribir una matriz de prueba de [0, 1, 2] muy bien, pero ¿cómo podemos hacer que el código sobre la salida de la matriz de prueba en el archivo sea el siguiente:

[0, 1, 2]
[0, 1, 2]
[0, 1, 2]
[0, 1, 2]
...
...

Recuerde: esto es solo una matriz de prueba, los datos reales son más grandes, y no puedo mantener todo el contenido en la RAM, por lo que debo poner los datos parte por parte de uno en uno.

EDIT 2:

He seguido más de la sugerencia de Simon. Aquí está la parte crítica:

hsize_t n = 3, p = 1;
float *bufi_data = new float[n * p];
float ** bufi = new float*[n];
for (hsize_t i = 0; i < n; ++i){
    bufi[i] = &bufi_data[i * n];
}

bufi[0][0] = 0.1;
bufi[0][1] = 0.2;
bufi[0][2] = 0.3;

//hyperslab
hsize_t start[2] = {0,0};
hsize_t count[2] = {3,1};

H5Sselect_hyperslab( fid1, H5S_SELECT_SET, start, NULL, count, NULL);
cout << "----------------------------------hyperslab done\n";   

H5Dwrite(dataset1, H5T_NATIVE_FLOAT, H5S_ALL, fid1, H5P_DEFAULT, *bufi);

bufi[0][0] = 0.4;
bufi[0][1] = 0.5;
bufi[0][2] = 0.6;

hsize_t fdimNew[2];
fdimNew[0] = 3;
fdimNew[1] = 2;
H5Dset_extent( dataset1, fdimNew );

cout << "----------------------------------extent done\n";

//hyperslab2
hsize_t start2[2] = {0,0}; //PROBLEM
hsize_t count2[2] = {3,1};

H5Sselect_hyperslab( fid1, H5S_SELECT_SET, start2, NULL, count2, NULL);     
cout << "----------------------------------hyperslab2 done\n";  

H5Dwrite(dataset1, H5T_NATIVE_FLOAT, H5S_ALL, fid1, H5P_DEFAULT, *bufi);

De lo anterior, obtuve el siguiente resultado para hdf5:

0.4 0.5 0.6
  0   0   0

Después de un nuevo experimento constart2 ycount2, Veo que estas variables solo afectan el índice de inicio y el índice de incremento parabufi. No mueve la posición del índice de escritura de mi conjunto de datos en absoluto.

Recordemos: el resultado final debe ser:

0.1 0.2 0.3
0.4 0.5 0.6

Además, debe serbufi en lugar de*bufi paraH5DwriteSimon porquebufi Me da números completamente al azar.

ACTUALIZACIÓN 3:

Para la parte de selección sugerida por Simon:

hsize_t start[2] = {0, 0};
hsize_t count[2] = {1, 3};

hsize_t start[2] = {1, 0};
hsize_t count[2] = {1, 3};

Estos darán el siguiente error:

HDF5-DIAG: Error detected in HDF5 (1.8.10) thread 0:
  #000: /home/hdftest/snapshots-bin-hdf5_1_8_10/current/src/H5Dio.c line 245 in H5Dwrite(): file selection+offset not within extent
    major: Dataspace
    minor: Out of range

count[2] debiera ser{3,1}, más bien que{1,3}, ¿Supongo? Y parastart[2], si no lo pongo como{0,0}, siempre gritará el error de arriba.

¿Estas seguro que esto es correcto?

Respuestas a la pregunta(1)

Su respuesta a la pregunta