Наборы медленной записи 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();
}

0 ответов

Другие вопросы по тегам