【问题标题】:storing dataset (instances of a C++ class) in hdf在 hdf 中存储数据集(C++ 类的实例)
【发布时间】:2012-01-06 04:20:45
【问题描述】:

我有一个需要将数据存储到 hdf 文件的应用程序。

是否可以将数据集存储在实际上是 C++ 对象的 hdf 中?例如,我想将下面对象 a 中包含的数据存储到 hdf 文件 (hdf4 or hdf5) 。我可以这样做吗?如果是的话,如果有人能做到这一点,我将不胜感激。谢谢你。

class A(){

public:
   A(int i, double j):i(i), j(j){};
   ~A();
   int i;
   double j;
   int* ai;
   vector<int> b;
   setValues(int i, double j){};
}

void main(){

  A *a;
  a = new A(10, 10.2);

  // Store this data to hdf4 or hdf5


  //
  A *a2;

  // now read in the data stored in hdf file and assign the value here

}

【问题讨论】:

    标签: c++ hdf5


    【解决方案1】:

    一种选择是使用复合类型,并将结构成员显式映射到 HDF 支持的基本类型。

    我发现这种方法的唯一复杂之处在于列表和序列。一种选择是将列表项存储在不同的数据集中,然后引用开始和结束索引。

    对于数据不连续或更复杂的情况,一种方法是使用链表类型构造。所以对于以下内容:

    class A {
        int i;
        vector<int> b;
    }
    

    这被映射到:

    ADataset => { i, b_index };
    BDataset => { value, next_index };
    

    “ADataset”中的记录存储一个“b_index”。 “BDataset”中的每条记录都包含该记录的值,然后是可选的 next_index。一个标记值可用于 'next_index' 知道何时停止。

    【讨论】:

      【解决方案2】:

      如果您的类属性是简单类型(intfloatchar……甚至是此类类型的数组),您可以将它们保存在复合数据类型中。

      在您展示的示例类中,有一个 STL vector。如果你有 STL 容器,你可能最好使用Boost serialization。输出将是您可以存储在 hdf5 文件中的 ASCII 文本。

      如果存储效率是您最关心的问题,那么您应该注意自己将vectors 写入可变大小的数组中,更一般地说,在 STL 容器(和/或自定义对象)和在将对象导出到 hdf5 文件或从 hdf5 文件导入对象时,您选择存储它们的任何 hdf5 数据类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-04
        • 2015-01-26
        • 1970-01-01
        相关资源
        最近更新 更多