如何从HDF5文件读取非常大的数据集?

问题描述 投票:0回答:1

我最近开始学习HDF5 API。假设我要读取一个非常大的向量(即一维数组),该向量作为数据集存储在HDF5文件中。它的大小N_SIZE太大,以致malloc(N_SIZE)失败。因此在我看来,我必须逐块阅读它。我应该在这里使用H5Dread_chunk()吗?

c hdf5
1个回答
0
投票

是的,如果数据集不适合主内存,则必须逐块读取数据集。另外,请注意,您的数据集必须使用分块存储布局创建。然后,您可以使用超级平板(即切片)一次读取一个块。

所有这些都可以通过HDFql大大简化。 HDFql是一种高级语言,可减轻处理HDF5文件的低级细节。

作为示例,您可以使用HDFql在C中执行以下操作:

// declare variables
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(%i:::1) INTO MEMORY 0", i);

    // execute script
    hdfql_execute(script);

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

可以在here中找到有关如何在C中使用HDFql的其他示例。

© www.soinside.com 2019 - 2024. All rights reserved.