SparseDataReader< Data_T > Class Template Reference
Classes and functions used to implement this library » Field IO classes under-the-hood

This class gets used by SparseFieldIO and SparseFileManager to read the block data. On creation it will open the data set and not close it until the object is destroyed. More...

`#include <SparseDataReader.h>`

## Public Member Functions

void | readBlock (int idx, Data_T &result)
| Reads a block, storing the data in result, which is assumed to contain enough room for m_valuesPerBlock entries.
void | readBlockList (int idx, const std::vector< Data_T * > &memoryList)
| Reads a series of blocks, storing each block of data in memoryList, which is assumed to contain enough room for m_valuesPerBlock entries.
| SparseDataReader (hid_t location, int valuesPerBlock, int occupiedBlocks)
| Constructor. Requires knowledge of the Hdf5 location where data is stored.

## Private Attributes

const std::string | k_dataStr
hid_t | m_location
int | m_occupiedBlocks
int | m_valuesPerBlock

## Detailed Description

template<class Data_T>
class SparseDataReader< Data_T >

This class gets used by SparseFieldIO and SparseFileManager to read the block data. On creation it will open the data set and not close it until the object is destroyed.

Definition at line 70 of file SparseDataReader.h.

## Constructor & Destructor Documentation

## SparseDataReader()

template<class Data_T>

SparseDataReader< Data_T >::SparseDataReader | ( | hid_t | location,
|  | int | valuesPerBlock,
|  | int | occupiedBlocks )

Constructor. Requires knowledge of the Hdf5 location where data is stored.

Definition at line 107 of file SparseDataReader.h.

: m_location(location),
m_valuesPerBlock(valuesPerBlock),
m_occupiedBlocks(occupiedBlocks),
k_dataStr("data")
{
}
SparseDataReader
This class gets used by SparseFieldIO and SparseFileManager to read the block data....
Definition SparseDataReader.h:71
SparseDataReader::m_occupiedBlocks
int m_occupiedBlocks
Definition SparseDataReader.h:97
SparseDataReader::m_location
hid_t m_location
Definition SparseDataReader.h:94
SparseDataReader::k_dataStr
const std::string k_dataStr
Definition SparseDataReader.h:99
SparseDataReader::m_valuesPerBlock
int m_valuesPerBlock
Definition SparseDataReader.h:96

References k_dataStr, m_location, m_occupiedBlocks, and m_valuesPerBlock.

## Member Function Documentation

## readBlock()

template<class Data_T>

void SparseDataReader< Data_T >::readBlock | ( | int | idx,
|  | Data_T & | result )

Reads a block, storing the data in result, which is assumed to contain enough room for m_valuesPerBlock entries.

Definition at line 120 of file SparseDataReader.h.

{
using namespace Hdf5Util;
using namespace Exc;
GlobalLock lock(g_hdf5Mutex);
Hdf5Util::H5ScopedDopen dataSet;
Hdf5Util::H5ScopedDget_space fileDataSpace;
Hdf5Util::H5ScopedDget_type dataType;
Hdf5Util::H5ScopedScreate memDataSpace;
hsize_t dims[2];
hsize_t memDims[1];
// Open the data set
dataSet.open(m_location, k_dataStr, H5P_DEFAULT);
if (dataSet.id() < 0)
throw OpenDataSetException("Couldn't open data set: " + k_dataStr);
// Get the space and type
fileDataSpace.open(dataSet.id());
dataType.open(dataSet.id());
if (fileDataSpace.id() < 0)
throw GetDataSpaceException("Couldn't get data space");
if (dataType.id() < 0)
throw GetDataTypeException("Couldn't get data type");
// Make the memory data space
memDims[0] = m_valuesPerBlock;
memDataSpace.create(H5S_SIMPLE);
H5Sset_extent_simple(memDataSpace.id(), 1, memDims, NULL);
// Get the dimensions and check they match
H5Sget_simple_extent_dims(fileDataSpace.id(), dims, NULL);
if (dims[1] != static_cast<hsize_t>(m_valuesPerBlock)) {
throw FileIntegrityException("Block length mismatch in "
"SparseDataReader");
}
if (dims[0] != static_cast<hsize_t>(m_occupiedBlocks))
throw FileIntegrityException("Block count mismatch in "
"SparseDataReader");
hsize_t offset[2];
hsize_t count[2];
herr_t status;
offset[0] = idx; // Index of block
offset[1] = 0; // Index of first data in block. Always 0
count[0] = 1; // Number of columns to read. Always 1
count[1] = m_valuesPerBlock; // Number of values in one column
status = H5Sselect_hyperslab(fileDataSpace.id(), H5S_SELECT_SET,
offset, NULL, count, NULL);
if (status < 0) {
throw ReadHyperSlabException("Couldn't select slab in readBlock(): " +
boost::lexical_cast<std::string>(idx));
}
status = H5Dread(dataSet.id(), DataTypeTraits<Data_T>::h5type(),
memDataSpace.id(), fileDataSpace.id(),
H5P_DEFAULT, &result);
}

References Hdf5Util::H5ScopedScreate::create(), g_hdf5Mutex, DataTypeTraits< T >::h5type(), Hdf5Util::H5Base::id(), k_dataStr, m_location, m_occupiedBlocks, m_valuesPerBlock, Hdf5Util::H5ScopedDget_space::open(), Hdf5Util::H5ScopedDget_type::open(), and Hdf5Util::H5ScopedDopen::open().

## readBlockList()

template<class Data_T>

void SparseDataReader< Data_T >::readBlockList | ( | int | idx,
|  | const std::vector< Data_T * > & | memoryList )

Reads a series of blocks, storing each block of data in memoryList, which is assumed to contain enough room for m_valuesPerBlock entries.

Definition at line 188 of file SparseDataReader.h.

{
using namespace Hdf5Util;
using namespace Exc;
GlobalLock lock(g_hdf5Mutex);
Hdf5Util::H5ScopedDopen dataSet;
Hdf5Util::H5ScopedDget_space fileDataSpace;
Hdf5Util::H5ScopedDget_type dataType;
Hdf5Util::H5ScopedScreate memDataSpace;
hsize_t dims[2];
hsize_t memDims[1];
// Open the data set
dataSet.open(m_location, k_dataStr, H5P_DEFAULT);
if (dataSet.id() < 0)
throw OpenDataSetException("Couldn't open data set: " + k_dataStr);
// Get the space and type
fileDataSpace.open(dataSet.id());
dataType.open(dataSet.id());
if (fileDataSpace.id() < 0)
throw GetDataSpaceException("Couldn't get data space");
if (dataType.id() < 0)
throw GetDataTypeException("Couldn't get data type");
// Make the memory data space
memDims[0] = m_valuesPerBlock;
memDataSpace.create(H5S_SIMPLE);
H5Sset_extent_simple(memDataSpace.id(), 1, memDims, NULL);
// Get the dimensions and check they match
H5Sget_simple_extent_dims(fileDataSpace.id(), dims, NULL);
if (dims[1] != static_cast<hsize_t>(m_valuesPerBlock)) {
throw FileIntegrityException("Block length mismatch in "
"SparseDataReader");
}
if (dims[0] != static_cast<hsize_t>(m_occupiedBlocks))
throw FileIntegrityException("Block count mismatch in "
"SparseDataReader");
hsize_t offset[2];
hsize_t count[2];
herr_t status;
offset[0] = idxLo; // Index of block
offset[1] = 0; // Index of first data in block. Always 0
count[0] = memoryList.size(); // Number of columns to read.
count[1] = m_valuesPerBlock; // Number of values in one column
status = H5Sselect_hyperslab(fileDataSpace.id(), H5S_SELECT_SET,
offset, NULL, count, NULL);
if (status < 0) {
throw ReadHyperSlabException("Couldn't select slab in readBlockList():" +
boost::lexical_cast<std::string>(idxLo));
}
// Make the memory data space ---
Hdf5Util::H5ScopedScreate localMemDataSpace;
hsize_t fileDims[2];
fileDims[0] = memoryList.size();
fileDims[1] = m_valuesPerBlock;
localMemDataSpace.create(H5S_SIMPLE);
H5Sset_extent_simple(localMemDataSpace.id(), 2, fileDims, NULL);
// Setup the temporary memory region ---
int bytesPerValue = 0;
{
hid_t t = DataTypeTraits<Data_T>::h5type();
if (t == H5T_NATIVE_CHAR)
bytesPerValue = 1;
else if (t == H5T_NATIVE_SHORT)
bytesPerValue = 2;
else if (t == H5T_NATIVE_FLOAT)
bytesPerValue = 4;
else if (t == H5T_NATIVE_DOUBLE)
bytesPerValue = 8;
}
int dim = sizeof(Data_T) / bytesPerValue;
std::vector<Data_T> bigblock(memoryList.size() * m_valuesPerBlock/dim);
status = H5Dread(dataSet.id(),
DataTypeTraits<Data_T>::h5type(),
localMemDataSpace.id(),
fileDataSpace.id(),
H5P_DEFAULT, &bigblock[0]);
if (status < 0) {
throw Hdf5DataReadException("Couldn't read slab " +
boost::lexical_cast<std::string>(idxLo));
}
// Distribute block data into memory slots ---
for (size_t i = 0; i < memoryList.size(); ++i) {
memcpy(memoryList[i],
&bigblock[i * m_valuesPerBlock / dim],
bytesPerValue * m_valuesPerBlock);
}
}
DataTypeTraits::h5type
static hid_t h5type()

References Hdf5Util::H5ScopedScreate::create(), g_hdf5Mutex, DataTypeTraits< T >::h5type(), Hdf5Util::H5Base::id(), k_dataStr, m_location, m_occupiedBlocks, m_valuesPerBlock, Hdf5Util::H5ScopedDget_space::open(), Hdf5Util::H5ScopedDget_type::open(), and Hdf5Util::H5ScopedDopen::open().

## Member Data Documentation

## m_location

template<class Data_T>

hid_t SparseDataReader< Data_T >::m_location

private

Definition at line 94 of file SparseDataReader.h.

Referenced by readBlock(), readBlockList(), and SparseDataReader().

## m_valuesPerBlock

template<class Data_T>

int SparseDataReader< Data_T >::m_valuesPerBlock

private

Definition at line 96 of file SparseDataReader.h.

Referenced by readBlock(), readBlockList(), and SparseDataReader().

## m_occupiedBlocks

template<class Data_T>

int SparseDataReader< Data_T >::m_occupiedBlocks

private

Definition at line 97 of file SparseDataReader.h.

Referenced by readBlock(), readBlockList(), and SparseDataReader().

## k_dataStr

template<class Data_T>

const std::string SparseDataReader< Data_T >::k_dataStr

private

Definition at line 99 of file SparseDataReader.h.

Referenced by readBlock(), readBlockList(), and SparseDataReader().

The documentation for this class was generated from the following file:

- export/SparseDataReader.h