2013-06-14 1 views
2

저는 C++ & HDF5를 사용하여 파일을 작성하고 있습니다. 그러나 문제가 있습니다. 이것은 내가 사용하는 코드입니다 :벡터가 2^13보다 큰 HDF5 파일을 쓸 수 없습니다.

void fileRead::writeFile(string name, const vector<double>* data) { 
int dimn = data->size(); 

hsize_t dim[1] = {data->size()}; //-> 2^13!!! 

hid_t sid = H5Pcreate(H5P_DATASET_CREATE); 
hid_t didProp = H5Screate_simple(1,dim,NULL); 
H5Pset_layout(sid, H5D_COMPACT); 

hid_t did = H5Dcreate(fid, name.c_str(),H5T_IEEE_F64LE, didProp, H5P_DEFAULT, sid,H5P_DEFAULT); 
H5Dwrite (did, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &(data->at(0))); 
H5Dclose(did); 

H5Sclose(didProp); 
H5Pclose(sid); 
} 

그러나 이것은 나에게이 오류 메시지를 제공합니다 :

HDF5-DIAG: Error detected in HDF5 (1.8.10) thread 0: #000: /pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5D.c line 170 in H5Dcreate2(): unable to create dataset 
    major: Dataset 
    minor: Unable to initialize object #001: /pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5Dint.c line 439 in H5D__create_named(): unable to create and link to dataset 
    major: Dataset 
    minor: Unable to initialize object #002: /pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5L.c line 1638 in H5L_link_object(): unable to create new link to object 
    major: Links 
    minor: Unable to initialize object #003: /pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5L.c line 1882 in H5L_create_real(): can't insert link 
    major: Symbol table 
    minor: Unable to insert object #004: /pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5Gtraverse.c line 861 in H5G_traverse(): internal path traversal failed 
    major: Symbol table 
    minor: Object not found #005: /pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5Gtraverse.c line 641 in H5G_traverse_real(): traversal operator failed 
    major: Symbol table 
    minor: Callback failed #006: /pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5L.c line 1685 in H5L_link_cb(): unable to create object 
    major: Object header 
    minor: Unable to initialize object #007: /pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5O.c line 3015 in H5O_obj_create(): unable to open object 
    major: Object header 
    minor: Can't open object #008: /pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5Doh.c line 293 in H5O__dset_create(): unable to create dataset 
    major: Dataset 
    minor: Unable to initialize object #009: /pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5Dint.c line 1044 in H5D__create(): unable to construct layout information 
    major: Dataset 
    minor: Unable to initialize object #010: /pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5Dcompact.c line 212 in H5D__compact_construct(): compact dataset size is bigger than header message maximum size 
    major: Dataset 
    minor: Unable to initialize object HDF5-DIAG: Error detected in HDF5 (1.8.10) thread 0: #000: /pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5D.c line 391 in H5Dclose(): not a dataset 
    major: Invalid arguments to routine 
    minor: Inappropriate type 

이 모든 벡터 크기에 발생> = 2^13 (8192). 어느 것이 더 큰 파일에 문제가되지 않습니다. 2^13은 여전히 ​​다소 작은 숫자이므로, 뭔가 내 코드로 fishi 여야합니다.

도움이 될 것입니다. 당신 H5Pset_layout에 대한 H5D_COMPACT 매개 변수에 대한 문서에서 magu_

+1

'double'이 8 바이트라고 가정하면 8192 * 8 = 65536 (즉 64KB)의 "원시"데이터 크기와 [H5Dcompact.c] (http : //www.hdfgroup.org/ftp/HDF5/current/src/unpacked/src/H5Dcompact.c)이 주석을 읽을 수 있습니다 : '데이터 크기가 최대 헤더 메시지 크기 (64KB)보다 작음을 확인하여 다른 레이아웃 메시지 필드 빼기 . " –

답변

3

: 파일의 데이터 세트 개체 헤더

스토어 원시 데이터. 소량의 원시 데이터가있는 데이터 집합에만 을 사용해야합니다. 원시 데이터 크기는 이며 64K (65520 바이트)입니다. 이 제한을 초과하는 원시 데이터 집합을 만들려고하면 H5Dcreate 호출이 실패합니다.

따라서 복식이 8 바이트이면 그 제한을 초과했습니다.

다른 저장 옵션 중 하나를 연속적으로 또는 청크로 사용해야합니다.

+0

흠, 그렇습니다. 대답은 Thx (둘 다 molbfnilo & gx_)입니다. 이제 작동합니다 (현재 ^^). –