无法写入矢量大于2 ^ 13的HDF5文件 [英] Can't write HDF5 file with vector bigger than 2^13

查看:1183
本文介绍了无法写入矢量大于2 ^ 13的HDF5文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用C ++& 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:在HDF5(1.8.10)线程0中检测到错误:#000:/pub/devel/hdf5/hdf5-1.8.10-1/ H5Dcreate2()中的src / hdf5-1.8.10 / src / H5D.c行170:无法创建数据集
major:数据集
minor:无法初始化对象#001:/ pub / devel / hdf5 /hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5Dint.c H5D__create_named()中的第439行:无法创建和链接到数据集
major:数据集
minor:Unable在H5L_link_object()中初始化对象#002:/pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5L.c行1638:无法创建到对象$ b的新链接$ b major:链接
minor:无法初始化对象#003:/pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5L.c第1882行中的H5L_create_real ():不能插入链接
major:符号表
minor:无法插入对象#004:/pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8。 10 / src / H5Gtraverse.c H5G_traverse()中的861行:内部路径遍历失败
major:符号表
minor:找不到对象#005:/pub/devel/hdf5/hdf5-1.8.10 -1 / src / hdf5-1.8.10 / src / H5Gtraverse.c H5G_traverse_real()中的641行:遍历运算符失败
major:符号表
minor:回调失败#006:/ pub / devel / hdf5 / hdf5-1.8.10-1 / src / hdf5-1.8.10 / src / H5L.c行1685在H5L_link_cb()中:无法创建对象
major:对象头
minor:无法初始化对象#007:/pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5O.c H5O_obj_create()中的行3015:无法打开对象
major:对象头
minor:不能在H5O__dset_create()中打开对象#008:/pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5Doh.c行293 :无法创建数据集
major:数据集
minor:无法初始化对象#009:/pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/ H5Dint.c H4D中的1044行_create():无法构造布局信息
major:数据集
minor:无法初始化对象#010:/pub/devel/hdf5/hdf5-1.8.10-1/ H5D_compact_construct()中的src / hdf5-1.8.10 / src / H5Dcompact.c行212:compact数据集大小大于头消息最大大小
major:数据集
minor:无法初始化对象HDF5-DIAG :HDF5(1.8.10)线程0中检测到错误:H5Dclose()中的#000:/pub/devel/hdf5/hdf5-1.8.10-1/src/hdf5-1.8.10/src/H5D.c线391 :不是数据集
major:例程的参数无效
minor:不适当类型

这发生在所有矢量大小> = 2 ^ 13(8192)。这是对我的困惑,因为阅读是没有问题的较大的文件,2 ^ 13仍然是一个相当小的数字,所以一定是鱼的我的代码。



任何帮助被嘲笑。
yours
magu _

解决方案

H5D_COMPACT 参数 H5Pset_layout


将原始数据存储在文件中的数据集对象标题中。这应该只有
用于具有少量原始数据的数据集。原始数据大小
限制为64K(65520字节)。尝试使用原始
数据创建大于此限制的数据集将导致H5Dcreate调用失败。




您需要使用其他存储选项之一,连续或分块。


I'm using C++ & HDF5 to write a file. But run into problems with it. This is the code I use:

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);
}

But this gives me this error message:

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

This happens for all vector sizes >= 2^13 (8192). Which is puzzeling me since reading in is no problem with bigger files and 2^13 is still a rather small number so something must be fishi with my code.

Any help would be appreatiated. yours magu_

解决方案

From the documentation for the H5D_COMPACT parameter for H5Pset_layout:

Store raw data in the dataset object header in file. This should only be used for datasets with small amounts of raw data. The raw data size limit is 64K (65520 bytes). Attempting to create a dataset with raw data larger than this limit will cause the H5Dcreate call to fail.

So if your doubles are 8 bytes, you've run into that limit.

You need to use one of the other storage options, contiguous or chunked.

这篇关于无法写入矢量大于2 ^ 13的HDF5文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆