43 mspace(1, &block_size),
44 dspace(1, &full_length),
45 dtype(ptr->getDataType()),
46 is_variable(dtype.isVariableStr())
49 var_buffer.resize(block_size);
51 fixed_length = dtype.getSize();
52 fix_buffer.resize(fixed_length * block_size);
54 final_buffer.resize(block_size);
72 while (consumed >= available) {
73 consumed -= available;
76 return final_buffer[consumed];
85 while (consumed >= available) {
86 consumed -= available;
89 return std::move(final_buffer[consumed]);
97 void next(
size_t jump = 1) {
112 return consumed + last_loaded;
116 const H5::DataSet* ptr;
117 hsize_t full_length, block_size;
118 H5::DataSpace mspace;
119 H5::DataSpace dspace;
123 std::vector<char*> var_buffer;
124 size_t fixed_length = 0;
125 std::vector<char> fix_buffer;
126 std::vector<std::string> final_buffer;
128 hsize_t last_loaded = 0;
129 hsize_t consumed = 0;
130 hsize_t available = 0;
133 if (last_loaded >= full_length) {
134 throw std::runtime_error(
"requesting data beyond the end of the dataset at '" +
get_name(*ptr) +
"'");
136 available = std::min(full_length - last_loaded, block_size);
137 constexpr hsize_t zero = 0;
138 mspace.selectHyperslab(H5S_SELECT_SET, &available, &zero);
139 dspace.selectHyperslab(H5S_SELECT_SET, &available, &last_loaded);
142 ptr->read(var_buffer.data(), dtype, mspace, dspace);
143 [[maybe_unused]] VariableStringCleaner deletor(dtype.getId(), mspace.getId(), var_buffer.data());
144 for (hsize_t i = 0; i < available; ++i) {
145 if (var_buffer[i] == NULL) {
146 throw std::runtime_error(
"detected a NULL pointer for a variable length string in '" +
get_name(*ptr) +
"'");
148 auto& curstr = final_buffer[i];
150 curstr.insert(0, var_buffer[i]);
154 auto bptr = fix_buffer.data();
155 ptr->read(bptr, dtype, mspace, dspace);
156 for (
size_t i = 0; i < available; ++i, bptr += fixed_length) {
157 auto& curstr = final_buffer[i];
159 curstr.insert(curstr.end(), bptr, bptr + find_string_length(bptr, fixed_length));
163 last_loaded += available;
hsize_t pick_1d_block_size(const H5::DSetCreatPropList &cplist, hsize_t full_length, hsize_t buffer_size=10000)
Definition pick_1d_block_size.hpp:26