хранение набора данных (экземпляры класса C ++) в формате hdf - PullRequest
4 голосов
/ 25 ноября 2011

У меня есть приложение, которое должно хранить данные в файле hdf.

Можно ли хранить набор данных в формате hdf, который на самом деле является объектом C ++?Например, я хочу сохранить данные, содержащиеся в объекте a ниже, в файле hdf (hdf4 или 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

}

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

Одним из вариантов является использование составных типов и явное сопоставление элементов структуры с основными типами, поддерживаемыми HDF.

Единственное осложнение, которое я обнаружил при подходе, было со списками и последовательностями. Один из вариантов - сохранить элементы списка в другом наборе данных, а затем сослаться на начальный и конечный индексы.

Для случаев, когда данные не являются смежными или более сложными, один из подходов заключается в использовании конструкции типа связанного списка. Так что для следующего:

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

Это сопоставлено с:

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

Записи в 'ADataset' хранят 'b_index'. Каждая запись в «BDataset» содержит значение для этой записи, а затем необязательный next_index. Для того, чтобы «next_index» знал, когда нужно остановиться, можно использовать значение часового.

0 голосов
/ 27 ноября 2011

Если ваши атрибуты класса были простыми типами (int, float, char ... даже массивами таких типов), вы могли бы сохранить их в составном типе данных.

В примере класса выпокажи, есть STL vector.Если у вас есть контейнеры STL, вам лучше использовать Boost serialization .Выводом будет текст ASCII, который вы можете сохранить в файле hdf5.

Если ваша главная задача - эффективность хранения, то вам следует позаботиться о том, чтобы записать vector s, например, в массив переменного размера,и, в более общем смысле, выполните преобразование между контейнерами STL (и / или пользовательскими объектами) и любым типом данных hdf5, выбранным вами для хранения их при экспорте и импорте ваших объектов в файл hdf5 и из него.

...