【问题标题】:How can I store datasets where different columns have different types?如何存储不同列具有不同类型的数据集?
【发布时间】:2019-09-03 16:03:18
【问题描述】:

假设我有一个包含不同列的表。这些列有不同的类型。例如:

col1,   col2,   col3
1.1    "hello"   1
2.2    "world"   2
...

这里col1floatdoublecol2stringcol3int。 现在我想使用 C++ 将这些数据存储在 hdf5 文件中。我该怎么做?

我已经找到this post 对 Python 有同样的问题。但我无法弄清楚如何在 C++ 中执行此操作,因为据我所知,您必须指定整个数据集的类型。

编辑: 有没有办法让一列有数组,比如说整数数组?例如:

col1,   col2,   col3,   col4
1.1    "hello"   1     {1, 3}
2.2    "world"   2     {1, 2, 3}
...

【问题讨论】:

  • Igor,HDF5 支持每列具有不同数据类型的表。我使用 Python,这些是用 NumPy 记录数组定义的。我不是 C++ 开发人员。据我了解,您需要创建一个定义不同变量类型的数据结构。
  • 我不知道该怎么做(而且我不认为我用来在 C++ 中读/写的包装库 HighFive 可以做到这一点)。一种解决方法是为每列创建一个数据集并将这些数据集分组。
  • 我不确定你问题的第一部分,也许在这里:support.hdfgroup.org/HDF5/doc/cpplus_RM/examples.html 你会发现一些有用的东西。关于第二部分,stackoverflow 上有并且在这里得到了完美的解释。 stackoverflow.com/questions/35580279/…

标签: c++ hdf5


【解决方案1】:

请查看HDFql,因为它可以让您从处理 HDF5 复合数据集的低级细节中解脱出来。在 C++ 中使用 HDFql,您的问题可以解决如下:

// define structure
struct data
{
    float col1;
    char *col2;
    int col3;
    HDFQL_VARIABLE_LENGTH col4;
};


// declare variables
char script[1024];
struct data values[2];
int *address;


// create a dataset named "my_dataset" of data type compound of one dimension (size 2) composed of four members (col1, col2, col3 and col4)
HDFql::execute("CREATE DATASET my_dataset AS COMPOUND(col1 AS FLOAT, col2 AS VARCHAR, col3 AS INT, col4 AS VARINT)(2)");


// populate variable "values"
values[0].col1 = 1.1;
values[0].col2 = (char *) malloc(10);
strcpy(values[0].col2, "hello");
values[0].col3 = 1;
address = (int *) malloc(2 * sizeof(int));
*address = 1;
*(address + 1) = 3;
values[0].col4.address = address;
values[0].col4.count = 2;

values[1].col1 = 2.2;
values[1].col2 = (char *) malloc(10);
strcpy(values[1].col2, "world");
values[1].col3 = 2;
address = (int *) malloc(3 * sizeof(int));
*address = 1;
*(address + 1) = 2;
*(address + 2) = 3;
values[1].col4.address = address;
values[1].col4.count = 3;


// insert (i.e. write) values from variable "values" into dataset "my_dataset"
sprintf(script, "INSERT INTO my_dataset VALUES FROM MEMORY %d SIZE %d OFFSET(%d, %d, %d, %d)", HDFql::variableTransientRegister(values), sizeof(struct data), offsetof(struct data, col1), offsetof(struct data, col2), offsetof(struct data, col3), offsetof(struct data, col4));
HDFql::execute(script);

或者,您可以让数据集在其第一个维度上可扩展(通过将其声明为无限大小),然后写入一行,用一个单位扩展维度,写入另一行,用一个单位扩展维度等...

有关如何使用 HDFql 的其他详细信息和示例,请参阅reference manual

【讨论】:

    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多