옵션 :: extend()는 확장 가능 데이터 세트 (link)에서만 사용할 수 있습니다.
데이터 세트가 최대 크기로 작성된 경우 데이터 세트를 확장 가능으로 변경할 수 없습니다. 무제한으로 만든 새 데이터 세트로 내용을 복사해야합니다.
여기 hdf 웹 사이트 (link)에서 가져온 예제가 있습니다. 답변에 대한
/*
* This example shows how to work with extendible dataset.
* In the current version of the library dataset MUST be
* chunked.
*/
#ifdef OLD_HEADER_FILENAME
#include <iostream.h>
#else
#include <iostream>
#endif
#include <string>
#ifndef H5_NO_NAMESPACE
#ifndef H5_NO_STD
using std::cout;
using std::endl;
#endif // H5_NO_STD
#endif
#include "H5Cpp.h"
#ifndef H5_NO_NAMESPACE
using namespace H5;
#endif
const H5std_string FILE_NAME("SDSextendible.h5");
const H5std_string DATASET_NAME("ExtendibleArray");
const int NX = 10;
const int NY = 5;
const int RANK = 2;
int main (void)
{
//Try block to detect exceptions raised by any of the calls inside it
try
{
/*
* Turn off the auto-printing when failure occurs so that we can
* handle the errors appropriately
*/
Exception::dontPrint();
//Create the data space with unlimited dimensions.
hsize_t dims[2] = { 3, 3}; // dataset dimensions at creation
hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED};
DataSpace mspace1(RANK, dims, maxdims);
//Create a new file. If file exists its contents will be overwritten.
H5File file(FILE_NAME, H5F_ACC_TRUNC);
//Modify dataset creation properties, i.e. enable chunking.
DSetCreatPropList cparms;
hsize_t chunk_dims[2] ={2, 5};
cparms.setChunk(RANK, chunk_dims);
//Set fill value for the dataset
int fill_val = 0;
cparms.setFillValue(PredType::NATIVE_INT, &fill_val);
//Create a new dataset within the file using cparms creation properties.
DataSet dataset = file.createDataSet(DATASET_NAME, PredType::NATIVE_INT, mspace1, cparms);
//Extend the dataset. This call assures that dataset is at least 3 x 3.
hsize_t size[2];
size[0] = 3;
size[1] = 3;
dataset.extend(size);
//Select a hyperslab.
DataSpace fspace1 = dataset.getSpace();
hsize_t offset[2];
offset[0] = 0;
offset[1] = 0;
hsize_t dims1[2] = { 3, 3}; /* data1 dimensions */
fspace1.selectHyperslab(H5S_SELECT_SET, dims1, offset);
//Write the data to the hyperslab.
int data1[3][3] = { {1, 1, 1}, /* data to write */
{1, 1, 1},
{1, 1, 1} };
dataset.write(data1, PredType::NATIVE_INT, mspace1, fspace1);
//Extend the dataset. Dataset becomes 10 x 3.
hsize_t dims2[2] = { 7, 1}; /* data2 dimensions */
dims[0] = dims1[0] + dims2[0];
size[0] = dims[0];
size[1] = dims[1];
dataset.extend(size);
//Select a hyperslab.
DataSpace fspace2 = dataset.getSpace();
offset[0] = 3;
offset[1] = 0;
fspace2.selectHyperslab(H5S_SELECT_SET, dims2, offset);
//Define memory space
DataSpace mspace2(RANK, dims2);
//Write the data to the hyperslab.
int data2[7] = { 2, 2, 2, 2, 2, 2, 2};
dataset.write(data2, PredType::NATIVE_INT, mspace2, fspace2);
//Extend the dataset. Dataset becomes 10 x 5.
hsize_t dims3[2] = { 2, 2}; /* data3 dimensions */
dims[1] = dims1[1] + dims3[1];
size[0] = dims[0];
size[1] = dims[1];
dataset.extend(size);
//Select a hyperslab
DataSpace fspace3 = dataset.getSpace();
offset[0] = 0;
offset[1] = 3;
fspace3.selectHyperslab(H5S_SELECT_SET, dims3, offset);
//Define memory space.
DataSpace mspace3(RANK, dims3);
//Write the data to the hyperslab.
int data3[2][2] = { {3, 3}, {3, 3} };
dataset.write(data3, PredType::NATIVE_INT, mspace3, fspace3);
//Read the data from this dataset and display it.
int i, j;
int data_out[NX][NY];
for (i = 0; i < NX; i++)
{
for (j = 0; j < NY; j++)
data_out[i][j] = 0;
}
dataset.read(data_out, PredType::NATIVE_INT);
/*
* Resulting dataset
*
* 1 1 1 3 3
* 1 1 1 3 3
* 1 1 1 0 0
* 2 0 0 0 0
* 2 0 0 0 0
* 2 0 0 0 0
* 2 0 0 0 0
* 2 0 0 0 0
* 2 0 0 0 0
* 2 0 0 0 0
*/
//Display the result.
for (i=0; i < NX; i++)
{
for(j=0; j < NY; j++)
cout << data_out[i][j] << " ";
cout << endl;
}
} // end of try block
// catch failure caused by the H5File operations
catch(FileIException error)
{
error.printError();
return -1;
}
// catch failure caused by the DataSet operations
catch(DataSetIException error)
{
error.printError();
return -1;
}
// catch failure caused by the DataSpace operations
catch(DataSpaceIException error)
{
error.printError();
return -1;
}
// catch failure caused by the DataSpace operations
catch(DataTypeIException error)
{
error.printError();
return -1;
}
return 0;
}
덕분에, 나는 무제한 최대 데이터 집합 크기, 내 질문에 넣을 수 있다는 것을 이해 내가는 최대 크기 제한에 데이터를 기록하고 내가 뭘해야 무엇이 제한을 초과하는 크기를 조정해야하는 경우 ? – Miral
만약 내가 당신이라면 나는 새로운 파일을 만들고 무한 차원의 새로운 데이터 세트로 데이터를 복사 할 것입니다. 그러나 동일한 파일을 사용하려는 경우 새 데이터 세트 (무제한)를 만들고 고정 데이터 세트의 데이터를 복사하고 고정 데이터 세트를 삭제하고 원하는 경우 무제한 데이터 세트의 이름을 삭제 된 이름으로 바꿀 수 있습니다 데이터 세트. –
무제한 차원 옵션을 사용하여 데이터 집합을 만든 경우에만 데이터 집합을 확장 할 수 있습니다. 너는 후에 그것을 할 수 없다. –