(C++)在 HDF5 中编写数据库
(C++) Writing a database in HDF5
您好,这是我第一次使用 HDF5,我正在尝试使用手动创建的数据集创建数据库表。该文件已经创建并已部署,但是每次我尝试插入单个数据注册表时(每次 cv::mat 为 1x6,因为我尝试插入整个数据集,但我也不能(我会收到以下消息:
H5Dwrite((:文件选择+偏移量不在范围之内 专业:数据空间 次要:超出范围在抛出"H5::D ataSetIException"实例后终止调用
我使用的代码如下
cv::Mat label;
int size = data.length()/n_features_objects;
size_t size_[2]={1,(hsize_t)n_features_objects};
hsize_t chunk[2]={1,(hsize_t)n_features_objects};
hsize_t max_size[2]={H5S_UNLIMITED,(hsize_t)n_features_objects};
H5::DSetCreatPropList prop;
prop.setChunk(2,chunk);
H5::DataSpace ds(2, size_,max_size);
H5::IntType datatype = H5::PredType::NATIVE_UINT64;
objects = labelFile.createDataSet(objects_name.toStdString(),datatype, ds,prop);
//get size of the dataset
H5::DataSpace ds = objects.getSpace();
int dims = ds.getSimpleExtentNdims();
hsize_t rc [dims];
ds.getSimpleExtentDims(rc);
int rows = (int)rc[0];
for(int z=0; z<size;z++)
{
hsize_t new_size[2]={1, (hsize_t)n_features_objects};
labels.extend(new_size);
cv::Mat label_oreg = cv::Mat::zeros(cv::Size(n_features_objects,1), CV_32SC1);
//Adding data registries one by one
label_oreg.at<int>(0,0) = label_oreg.at<int>(z,0);
label_oreg.at<int>(0,1) = label_oreg.at<int>(z,1);
label_oreg.at<int>(0,2) = label_oreg.at<int>(z,2);
label_oreg.at<int>(0,3) = label_oreg.at<int>(z,3);
label_oreg.at<int>(0,4) = label_oreg.at<int>(z,4);
label_oreg.at<int>(0,5) = label_oreg.at<int>(z,5);
hsize_t rows_ext[2] ={1, (hsize_t)n_features_objects};
hsize_t offset[2] ={(hsize_t)1, 0};
ds = labels.getSpace();
ds.selectHyperslab(H5S_SELECT_SET,rows_ext, offset);
H5::DataSpace mem_space(2, rows_ext);
labels.write(label.data, H5::PredType::NATIVE_INT32, mem_space, ds);
}
有谁知道我在这里错过了什么?我想我的结果很奇怪,因为我总是在数据空间中注册一个新的数据块,以便使用它来放置注册表。
根据问题的标题和描述,您似乎希望在不覆盖现有数据的情况下将数据添加(即追加(到 HDF5 数据集中,就像表(在关系数据库中(允许您添加行而不覆盖现有行一样。
如果这是正确的,这里有一个通用示例,说明了如何在C++中使用 HDFql 完成此操作(我不知道如何在其他 HDF5 C++ API 中做到这一点(:
// declare variable
unsigned long long values[6];
// create HDF5 file "my_file.h5" and use (i.e. open) it
HDFql::execute("CREATE AND USE FILE my_file.h5");
// create HDF5 dataset "my_dataset" of datatype unsigned long long (64 bit) of two dimensions (unlimited x 6)
HDFql::execute("CREATE CHUNKED(1, 6) DATASET my_dataset AS UNSIGNED BIGINT(0 TO UNLIMITED, 6)");
// register variable "values" for subsequent use (by HDFql)
HDFql::variableRegister(values);
// keep reading data (from hypothetical function "read") and store it in variable "values" until there is no more to read
while(read(values))
{
// extend first dimension of dataset "my_dataset" one unit
HDFql::execute("ALTER DIMENSION my_dataset TO +1");
// insert (i.e. write) content of variable "values" into the last position of the first dimension of dataset "my_dataset" (thanks to a hyperslab selection)
HDFql::execute("INSERT INTO my_dataset[-1:1:1:1] VALUES FROM MEMORY 0");
}
// unregister variable "values" as it is no longer used/needed (by HDFql)
HDFql::variableUnregister(values);
相关文章:
- 查询SQLite数据库中的日期
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在ArangoDb AQL查询中指定数据库
- 从数据库实时显示QT c++中的数据
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 使用g++编译hdf5源代码
- 无法在C++中建立与MySQL数据库的连接
- 将类实现到数据库程序中
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 调试编译的服务器在数据库打开时崩溃
- C++变量mysql_query到数据库
- LMDB:在有限的内存系统中打开大型数据库
- 如何在多个线程中创建 QSql数据库连接时防止名称冲突
- 以只读模式打开数据库时SQLITE_CANTOPEN错误
- 如何使用SQLite将数据库中的值导出为C / C++中的字符串或字符?
- 如何在Qt中从数据库中检索二进制数据?
- 如何从网站获取数据并将其传输到数据库?
- 在装有 CLion 的 Mac 上使用 C++ 连接到 MySQL 数据库时出现问题
- (C++)在 HDF5 中编写数据库