Как прочитать очень большой набор данных из файла HDF5? - PullRequest
1 голос
/ 13 февраля 2020

Я начал изучать HDF5 API совсем недавно. Предположим, что я собираюсь прочитать очень большой вектор (т.е. одномерный массив), который хранится в виде набора данных в файле HDF5. Его размер N_SIZE настолько велик, что malloc(N_SIZE) терпит неудачу. Так что мне кажется, что я должен читать это по частям. Должен ли я использовать H5Dread_chunk() здесь?

1 Ответ

3 голосов
/ 13 февраля 2020

Да, вам придется читать блок данных по частям, если он не помещается в основную память. Кроме того, обратите внимание, что ваш набор данных должен быть создан с разбивкой по частям. Затем вы можете прочитать один блок за раз, используя гиперслабы (то есть срезы).

Все это можно значительно упростить с помощью HDFql . HDFql - это язык высокого уровня, который освобождает вас от низкоуровневых деталей обработки файлов HDF5.

Например, вы можете сделать следующее в C с использованием HDFql:

// declare variables
char script[100];
int data[1024][1024];
int i;

// create a HDF5 file named 'my_file.h5'
hdfql_execute("CREATE FILE my_file.h5");

// use (i.e. open) HDF5 file 'my_file.h5'
hdfql_execute("USE FILE my_file.h5");

// create a three dimensional chunked dataset named 'my_dataset' (each chunk is 1 MB)
hdfql_execute("CREATE CHUNKED(1, 1024, 1024) DATASET my_dataset AS INT(100, 1024, 1024)");

// register variable 'data' for subsequent usage
hdfql_variable_register(data);

// loop 100 times (i.e. number of chunks that exists in dataset 'my_dataset')
for(i = 0; i < 100; i++)
{
    // prepare script to read one chunk at the time using an hyperslab
    sprintf(script, "SELECT FROM my_dataset(%d:::1) INTO MEMORY 0", i);

    // execute script
    hdfql_execute(script);

    // call hypothetical function 'process' passing variable 'data' that contains the chunked data
    process(data);
}

Дополнительные примеры использования HDFql в C можно найти здесь .

...