HDFql 将数据添加到现有数据集
HDFql Adding Data to Existing Dataset
我想用 C++ 创建一个 HDF5 文件,然后将数据动态添加到该文件中包含的数据集。然而,我在完成这项工作时遇到了一些麻烦,这个最小的例子是我目前的最佳尝试(主要基于 by SOG):
#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 的简短解释(我在这里盲目地使用它)或 link 解释它的文档。
非常感谢!
编辑
这是一个基于@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");
}
根据 HDFql release notes,操作 ALTER DIMENSION
在 2.1.0 版中更改了语法(即操作不再需要括号来包围维度)。
因此,将您的代码更改为:
HDFql::execute("ALTER DIMENSION dset TO +1");
可以在 HDFql reference manual.
中找到有关此操作以及超平板的其他信息
我想用 C++ 创建一个 HDF5 文件,然后将数据动态添加到该文件中包含的数据集。然而,我在完成这项工作时遇到了一些麻烦,这个最小的例子是我目前的最佳尝试(主要基于
#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 的简短解释(我在这里盲目地使用它)或 link 解释它的文档。
非常感谢!
编辑
这是一个基于@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");
}
根据 HDFql release notes,操作 ALTER DIMENSION
在 2.1.0 版中更改了语法(即操作不再需要括号来包围维度)。
因此,将您的代码更改为:
HDFql::execute("ALTER DIMENSION dset TO +1");
可以在 HDFql reference manual.
中找到有关此操作以及超平板的其他信息