Как разделить составной тип данных HDF5 в С++

У меня есть файл HDF5 с составным типом (int, double, double). В настоящее время я читаю его за одну операцию, сохраняя результат в массиве структур, следующих пример в документации.

Однако вместо этого я бы предпочел сохранить каждую из трех частей в другом массиве, поэтому я хотел бы предоставить 3 указателя (int*, double*, double*) и читать данные непосредственно в трех массивах без копирования данных.

Есть ли у кого-нибудь предложение о том, как это сделать?


person Andrea Zonca    schedule 14.03.2011    source источник


Ответы (2)


Я не думаю, что это возможно напрямую.

Вы можете легко скопировать свой массив структур в три массива в цикле:

int a[n];
double b[n], c[n];
for (int i = 0; i < n; i++)
{
    a[i] = s[i].a;
    b[i] = s[i].b;
    c[i] = s[i].c;
}

предполагая, что s представляет собой массив из struct { int a; double b; double c; } (постоянного) размера n, но у меня такое чувство, что вы ищете прямой способ HDF5…

Ясно, что гиперпласт не будет работать, так как я считаю, что составной тип является атомарным. В любом случае составной тип подразумевает, что данные хранятся составные в файле, поэтому, вероятно, более эффективно читать их таким образом. Единственным ограничением решения, которое я вам дал, является память, если ваш массив действительно большой. Хотя на современном компе должно быть нормально ;)

person Simon    schedule 15.03.2011
comment
спасибо Саймон, я не хочу копировать данные, я больше ограничен памятью, чем ограничен вводом-выводом, поэтому на данный момент я предпочитаю обращаться к файлу 3 раза, как я сейчас делаю, и читать одно поле за раз... мой массив может быть несколько ТБ. - person Andrea Zonca; 15.03.2011
comment
в моем понимании ответ таков, что это невозможно, как говорит @Simon. - person Andrea Zonca; 31.03.2011

Вы можете определить одно поле в составном типе. Предположим, ваш набор данных открыт как dset с тремя полями "a","b","c" из LENGTH элементов, тогда

int a[LENGTH];
double b[LENGTH], c[LENGTH];    

CompType atype(sizeof(int));
atype.insertMember("a", 0, PredType::NATIVE_INT);
dset.read(a, atype);

CompType btype(sizeof(double));
btype.insertMember("b", 0, PredType::NATIVE_DOUBLE);
dset.read(b, btype);

CompType ctype(sizeof(double));
ctype.insertMember("c", 0, PredType::NATIVE_DOUBLE);
dset.read(c, ctype);

Это должно делать то, о чем вы просили. Может быть, вы уже делаете это, «читая файл три раза»?

person Kambrian    schedule 12.10.2015