Pisanie i dołączanie tablic float do jedynego zestawu danych w pliku hdf5 w C ++

Przetwarzam liczbę plików, każde przetwarzanie pliku spowoduje wyświetlenie kilku tysięcy tablic float i zrobię toprzechowuj dane wszystkich plików w jednym ogromnym zbiorze danych w jednym hdf5 do dalszego przetwarzania.

Rzecz w tym, że jestem zdezorientowany, jak dołączyć moje dane do pliku hdf5. (skomentuj w powyższym kodzie) W 2 dla pętli powyżej, jak widać, chcę dodać 1 wymiarową tablicę float do hdf5 naraz, a nie jako całość. Moje dane są w terabajtach i możemy tylko dodawać dane do pliku.

Jest kilka pytań:

Jak dołączyć dane w tym przypadku? Jakiego rodzaju funkcji muszę użyć?W tej chwili mam fdim [0] = 928347543, próbowałem umieścić flagę nieskończoności HDF5, ale wykonanie wykonawcze narzeka. Czy istnieje sposób, aby to zrobić? Nie chcę obliczać danych, które mam za każdym razem; czy istnieje sposób na proste dodawanie danych, bez dbania o wartość fdim?

Czy to nie jest możliwe?

EDYTOWAĆ:

Śledziłem sugestię Simona, a obecnie jest mój zaktualizowany kod:

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";    

Moje obecne wyjście to:

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

Obecnie widzę, że ustawianie rzeczy bez limitu z H5Dset_extent nadal powoduje problem podczas działania. (problematyczna funkcja jest oznaczona symbolem//COMPLAINS HERE w powyższym kodzie.) Mam już dane dotyczące fragmentów określone przez Simona, więc w czym problem?

Z drugiej strony, bez H5Dset_extent, mogę napisać tablicę testową o wartości [0, 1, 2] w porządku, ale jak możemy zrobić kod powyżej wyniku tablicy testowej do pliku w następujący sposób:

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

Przypomnijmy: jest to tylko tablica testowa, rzeczywiste dane są większe, a ja nie mogę trzymać całości w pamięci RAM, więc muszę umieszczać dane częściowo po części po kolei.

EDYCJA 2:

Podążyłem za sugestią Simona. Oto krytyczna część:

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);

Z powyższego otrzymałem następujące dane wyjściowe dla hdf5:

0.4 0.5 0.6
  0   0   0

Po dalszym eksperymentowaniu zstart2 icount2, Widzę, że te zmienne wpływają tylko na indeks początkowy i indeks przyrostowybufi. W ogóle nie zmienia pozycji indeksu zapisu mojego zestawu danych.

Przypomnij: ostateczny wynik musi być:

0.1 0.2 0.3
0.4 0.5 0.6

Poza tym musi byćbufi zamiast*bufi dlaH5Dwrite, Simon, bobufi daje mi całkowicie losowe liczby.

AKTUALIZACJA 3:

Dla części wyboru zaproponowanej przez Simona:

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

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

Zostanie wyświetlony następujący błąd:

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] powinno być{3,1}raczej niż{1,3}, Przypuszczam? I dlastart[2], jeśli nie ustawię tego jako{0,0}, zawsze wykrzyczy błąd powyżej.

Czy jesteś pewien, że to prawda?

questionAnswers(1)

yourAnswerToTheQuestion