1

I have this code to write chunks of arrays to HDF5 and I want to add a timestamp attribute to each chunk or another field with a datetime

using AS.HDFql;

// declare variables
float[,,] traindata = new float[1, 100, 500];
int number;
int i;

// create an HDF5 file named 'Test.h5' and use (i.e. open) it
HDFql.Execute("create and use file Test.h5");

// create a chunked dataset named 'data' (within a group named 'grp') of data type float with three dimensions (the first dimension is extendible)
HDFql.Execute("create chunked(1, 100, 500) dataset grp/data as float(0 to unlimited, 100, 500)");

// register variable 'traindata'
number = HDFql.VariableRegister(traindata);

// loop 100000 times
for(i = 0; i < 100000; i++)
{
   // populate variable 'traindata'
   // (...)

   // insert (i.e. write) data stored in 'traindata' into the last position of 'data' (using a hyperslab selection)
   HDFql.Execute("insert into grp/data(-1:::) values from memory " + number);

   // alter (i.e. extend) first dimension of 'data' plus one unit
   HDFql.Execute("alter dimension grp/data to +1");
}
Mario
  • 13,941
  • 20
  • 54
  • 110

1 Answers1

1

One way to have a timestamp associated to each chunk written in the HDF5 file is to have a compound dataset with two members: the first member stores the data itself while the second stores the timestamp (e.g. UNIX epoch time). Updating your code, this could look as follows:

// use HDFql namespace
using AS.HDFql;

// declare structure
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct Data
{
    public float [,]vals;
    public int timestamp;
}

// declare variables
Data []traindata = new Data[1];
int number;
int i;

// create an HDF5 file named 'Test.h5' and use (i.e. open) it
HDFql.Execute("create and use file Test.h5");

// create a chunked dataset named 'data' (within a group named 'grp') as an extendible compound (with two members 'vals' and 'timestamp')
HDFql.Execute("create chunked(1) dataset grp/data as compound(vals as float(100, 500), timestamp as unsigned int)(0 to unlimited)");

// register variable 'traindata'
number = HDFql.VariableRegister(traindata);

// loop 100000 times
for(i = 0; i < 100000; i++)
{
    // populate variable 'traindata' (i.e. update members 'vals' and 'timestamp' with values)
    // (...)

    // alter (i.e. extend) first dimension of dataset 'data' plus one unit
    HDFql.Execute("alter dimension grp/data to +1");

    // insert (i.e. write) data stored in 'traindata' into the last position of dataset 'data' (using a hyperslab selection)
    HDFql.Execute("insert into grp/data(-1:::) values from memory " + number);
}
SOG
  • 876
  • 6
  • 10