HDFql将数据添加到现有数据集中

时间:2019-09-05 05:51:03

标签: hdf5 hdf hdfql

我想用C ++创建一个HDF5文件,并将数据动态添加到该文件中包含的数据集中。但是,以这个最小的示例作为我目前的最佳尝试(主要基于answerSOG),我在进行这项工作时遇到了一些麻烦:

#include <stdio.h>
#include <HDFql.hpp>

int main (int argc, const char * argv[]) {
    char script[1024];

    //Create HDF5 file
    HDFql::execute("CREATE TRUNCATE FILE /tmp/test.h5");
    HDFql::execute("USE FILE /tmp/test.h5");

    //Generate some arbitrary data
    int data_size = 10;
    int data[data_size];
    for (int i=0; i<data_size; i++) {data[i]=i+data_size;}

    //Create a dataset "dset"
    HDFql::execute("CREATE CHUNKED DATASET dset AS INT(UNLIMITED)");
    //In the loop, add one element to dset on each iteration
    for(int i=0; i<10; i++)
    {
        HDFql::execute("ALTER DIMENSION dset TO (+1)");
        sprintf(script, "INSERT INTO dset(-1:1:1:1) VALUES(%d)", i);
        HDFql::execute(script);
    }
    //Add an array of values to dset
    sprintf(script, "ALTER DIMENSION dset TO (%d)", data_size);
    HDFql::execute(script);
    sprintf(script, "INSERT INTO dset(-1:1:1:1) VALUES(%d)", data_size);
    HDFql::execute(script);

    //Read all values in dset and print to console
    HDFql::execute("SELECT FROM dset");
    int cnt=0;
    while(HDFql::cursorNext(NULL) == HDFQL_SUCCESS)
    {
        printf("Value at %d: %d\n", cnt, *HDFql::cursorGetInt(NULL));
        cnt++;
    }

    HDFql::execute("CLOSE FILE");
}

我希望控制台的输出为:

Value at 0: 0
Value at 1: 1
Value at 2: 2
...
Value at 19: 19

相反,输出为:

Value at 0: 10

确实,检查HDF5文件显示它仅包含一个值10。那么我的代码有什么问题,为什么?另外,对hyperslab的简短解释(我在这里很盲目使用)或解释它的文档链接也将非常感谢。

非常感谢!

编辑

这是一个基于@SOG答案的工作代码示例:

#include <stdio.h>
#include <HDFql.hpp>

int main (int argc, const char * argv[]) {
    char script[1024];

    HDFql::execute("CREATE TRUNCATE FILE /tmp/test.h5");
    HDFql::execute("USE FILE /tmp/test.h5");

    int data_size = 10;
    int data[data_size];
    for (int i=0; i<data_size; i++) {data[i]=i+data_size;}

    HDFql::execute("CREATE CHUNKED DATASET dset AS INT(UNLIMITED)");
    for(int i=0; i<10; i++)
    {
        if(i>0) {HDFql::execute("ALTER DIMENSION dset TO +1");}
        sprintf(script, "INSERT INTO dset(-1:1:1:1) VALUES(%d)", i);
        HDFql::execute(script);
    }
    sprintf(script, "ALTER DIMENSION dset TO +%d", data_size);
    HDFql::execute(script);
    sprintf(script, "INSERT INTO dset(-%d:1:1:%d) VALUES FROM MEMORY %d",
            data_size, data_size, HDFql::variableTransientRegister(data));
    HDFql::execute(script);


    int cnt=0;
    HDFql::execute("SELECT FROM dset");
    while(HDFql::cursorNext(NULL) == HDFQL_SUCCESS)
    {
        printf("Value at %d: %d\n", cnt, *HDFql::cursorGetInt(NULL));
        cnt++;
    }

    HDFql::execute("CLOSE FILE");
}

1 个答案:

答案 0 :(得分:1)

根据HDFql release notes,操作ALTER DIMENSION在2.1.0版中更改了语法(即该操作不再需要括号来包围尺寸)。

因此,将您的代码更改为:

HDFql::execute("ALTER DIMENSION dset TO +1");

有关此操作以及超平板的其他信息,可以在HDFql reference manual中找到。