Наборы медленной записи HDF5 с fill_time_never
У меня проблема с наборами данных hdf5 с помощью H5D_FILL_TIME_NEVER в следующем коде. Он создает файл HDF5, содержащий наборы данных Matrix1 и Matrix2, оба с H5D_FILL_TIME_NEVER. Если я удаляю последний блок, записывающий в Matrix2, код выполняется за несколько миллисекунд. Если код выполняется полностью, кажется, что он заполняет matrix1, как только я получаю доступ к matrix2, выполнение которой занимает 16 секунд. Есть ли способ получить разумную производительность здесь?
Мой пример использования следующий: я извлекаю данные векторным тиском и должен добавить их в виде столбца в Matrix1 и в виде строки в Matrix2. Нет возможности сначала написать Matrix1, а затем написать Matrix2, я должен написать их одновременно.
Я использую HDF5 версии 1.8.15 с Visual Studio 2012
auto file = H5::H5File( "E:\\test.h5", H5F_ACC_TRUNC );
file.flush( H5F_SCOPE_GLOBAL );
hsize_t rows = 1000;
hsize_t cols = 1000000;
{
H5::DSetCreatPropList plist;
plist.setFillTime( H5D_FILL_TIME_NEVER );
plist.setAllocTime( H5D_ALLOC_TIME_LATE );
hsize_t dims[2] = {rows, cols};
H5::DataSet set1 = file.createDataSet( "/Matrix1", H5::PredType::NATIVE_DOUBLE, H5::DataSpace( 2, dims ), plist );
set1.close();
plist.close();
}
{
H5::DSetCreatPropList plist;
plist.setFillTime( H5D_FILL_TIME_NEVER );
plist.setAllocTime( H5D_ALLOC_TIME_LATE );
hsize_t dims[2] = {rows, cols};
H5::DataSet set1 = file.createDataSet( "/Matrix2", H5::PredType::NATIVE_DOUBLE, H5::DataSpace( 2, dims ), plist );
set1.close();
plist.close();
}
{
double value = 1;
H5::DataSet set = file.openDataSet( "/Matrix1" );
hsize_t matdims[2];
matdims[0] = 1;
matdims[1] = 1;
H5::DataSpace memspace( 2, matdims );
H5::DataSpace dataspace = set.getSpace();
dataspace.selectNone();
const hsize_t count[2] = {1, 1};
const hsize_t start[2] = {0, 0};
const hsize_t block[2] = {1, 1};
dataspace.selectHyperslab( H5S_SELECT_SET, count, start, 0, block );
set.write( &value,
H5::PredType::NATIVE_DOUBLE,
memspace,
dataspace );
set.close();
}
{
double value = 1;
H5::DataSet set = file.openDataSet( "/Matrix2" );
hsize_t matdims[2];
matdims[0] = 1;
matdims[1] = 1;
H5::DataSpace memspace( 2, matdims );
H5::DataSpace dataspace = set.getSpace();
dataspace.selectNone();
const hsize_t count[2] = {1, 1};
const hsize_t start[2] = {0, 0};
const hsize_t block[2] = {1, 1};
dataspace.selectHyperslab( H5S_SELECT_SET, count, start, 0, block );
set.write( &value,
H5::PredType::NATIVE_DOUBLE,
memspace,
dataspace );
set.close();
}