Hello HDF community
I want to store a large number of floating point numbers (20 000) , that
evolves over time.
At each time step, I want to save my 20 000 numbers in a HDF5 file.
I have tried to store them individually in datasets, (by creating 20 000
datasets), and extend each dataset when adding new data.
It works but it creates a large HDF5 file for small number of records (48.8
Mo to store the first iteration, with 20 000 * 64 bit floating numbers)
As I could not find a reasonnable solution, I now try to save them in a
compound dataset that I create dynamically.
I succeeded, however I am facing a limitation on the number of columns I
can insert in my compound dataset.
Apparently I can't create more than 1092 columns, and it is due to a limit
on an attribute's size that is 64K
H5O_alloc(): object header message is too large
1)
Is there a way to fix this?
2)
Is the only solution is:
- to store raw 64 bit floating number in an extendible numeric 2D array?
- to store columns name in a separate dataset?
I am using Hdf5 1.8.16 and 1.10.1
Below are the programs I use to create my dynamic compound dataset, and the
error message I have.
module hdf5_module
!
use iso_c_binding
use hdf5
implicit none
!
integer, parameter :: r_k8 = selected_real_kind(10)
!
integer, parameter :: HDF5_RANK = 1
!
integer(hid_t) :: hdf5_s1_tid
integer(hid_t) :: hdf5_file_id ! File identifier
integer(hid_t) :: hdf5_dset_id1 ! Dataset identifier
integer(hid_t) :: hdf5_dset_id1_prop ! Dataset creation property
identifier
contains
subroutine hdf5_init(filename)
!
character(len=*), intent(in) :: filename
!
integer :: error
integer(hid_t) :: fapl_id
integer(hid_t) :: dataspace
integer(hid_t) :: memspace
character(len=15), parameter :: dsetname = "results"
integer(hsize_t), dimension(1), parameter :: dimsc = (/1/)
integer(hsize_t), dimension(1) :: dims = (/0/)
integer(hsize_t), dimension(1) :: maxdims = (/0/)
integer(size_t) :: structure_size
integer :: i
character(len=6) :: char_i
call h5open_f(error)
!
! H5F_LIBVER_EARLIEST_F
! H5F_LIBVER_LATEST_F
call h5pcreate_f( H5P_FILE_ACCESS_F, fapl_id, error)
call h5pset_libver_bounds_f(fapl_id, H5F_LIBVER_LATEST_F,
H5F_LIBVER_LATEST_F, error)
call h5fcreate_f(filename, H5F_ACC_TRUNC_F, hdf5_file_id, error)
maxdims = H5S_UNLIMITED_F
call h5screate_simple_f(HDF5_RANK, dims, dataspace, error, maxdims)
call h5pcreate_f(H5P_DATASET_CREATE_F, hdf5_dset_id1_prop, error)
call h5pset_chunk_f(hdf5_dset_id1_prop, HDF5_RANK, dimsc, error)
structure_size = 1092 * 8
call H5Tcreate_f(H5T_COMPOUND_F, structure_size, hdf5_s1_tid, error)
do i=1,1092
write(char_i, '(I6.6)') i
call H5Tinsert_f(hdf5_s1_tid, "x"//char_i, int (8*(i-1),
size_t), h5kind_to_type(r_k8,H5_REAL_KIND), error)
end do
call h5dcreate_f(hdf5_file_id, dsetname, hdf5_s1_tid, dataspace,
hdf5_dset_id1, error, hdf5_dset_id1_prop)
call h5sclose_f(dataspace, error)
end subroutine
subroutine hdf5_close()
integer :: error
call h5pclose_f(hdf5_dset_id1_prop, error)
call h5dclose_f(hdf5_dset_id1, error)
call h5fclose_f(hdf5_file_id, error)
end subroutine
end module
program toto
use hdf5_module
character(LEN=12), parameter :: filename = "resultats.h5"
call hdf5_init(filename)
call hdf5_close()
end program
HDF5-DIAG: Error detected in HDF5 (1.10.1) thread 0:
#000: hdf5-1.10.1/src/H5D.c line 145 in H5Dcreate2(): unable to
create dataset
major: Dataset
minor: Unable to initialize object
#001: hdf5-1.10.1/src/H5Dint.c line 490 in H5D__create_named():
unable to create and link to dataset
major: Dataset
minor: Unable to initialize object
#002: hdf5-1.10.1/src/H5L.c line 1695 in H5L_link_object(): unable to
create new link to object
major: Links
minor: Unable to initialize object
#003: hdf5-1.10.1/src/H5L.c line 1939 in H5L_create_real(): can't
insert link
major: Symbol table
minor: Unable to insert object
#004: hdf5-1.10.1/src/H5Gtraverse.c line 867 in H5G_traverse():
internal path traversal failed
major: Symbol table
minor: Object not found
#005: hdf5-1.10.1/src/H5Gtraverse.c line 639 in H5G_traverse_real():
traversal operator failed
major: Symbol table
minor: Callback failed
#006: hdf5-1.10.1/src/H5L.c line 1742 in H5L_link_cb(): unable to
create object
major: Object header
minor: Unable to initialize object
#007: hdf5-1.10.1/src/H5O.c line 3178 in H5O_obj_create(): unable to
open object
major: Object header
minor: Can't open object
#008: hdf5-1.10.1/src/H5Doh.c line 291 in H5O__dset_create(): unable
to create dataset
major: Dataset
minor: Unable to initialize object
#009: hdf5-1.10.1/src/H5Dint.c line 1256 in H5D__create(): can't
update the metadata cache
major: Dataset
minor: Unable to initialize object
#010: hdf5-1.10.1/src/H5Dint.c line 916 in H5D__update_oh_info():
unable to update datatype header message
major: Dataset
minor: Unable to initialize object
#011: hdf5-1.10.1/src/H5Omessage.c line 183 in H5O_msg_append_oh():
unable to create new message in header
major: Attribute
minor: Unable to insert object
#012: hdf5-1.10.1/src/H5Omessage.c line 223 in H5O_msg_append_real():
unable to create new message
major: Object header
minor: No space available for allocation
#013: hdf5-1.10.1/src/H5Omessage.c line 1933 in H5O_msg_alloc():
unable to allocate space for message
major: Object header
minor: Unable to initialize object
#014: hdf5-1.10.1/src/H5Oalloc.c line 1314 in H5O_alloc(): object
header message is too large
major: Object header
minor: Unable to initialize object