【发布时间】:2020-05-28 19:01:57
【问题描述】:
我最近开始学习 HDF5 API。假设我要读取一个非常大的向量(即一维数组),它作为数据集存储在 HDF5 文件中。它的大小N_SIZE 太大以至于malloc(N_SIZE) 失败。所以在我看来,我必须逐块阅读它。我应该在这里使用H5Dread_chunk() 吗?
【问题讨论】:
-
好吧,试试看。我们都通过尝试来学习,而不是通过询问来学习。 ;-)
我最近开始学习 HDF5 API。假设我要读取一个非常大的向量(即一维数组),它作为数据集存储在 HDF5 文件中。它的大小N_SIZE 太大以至于malloc(N_SIZE) 失败。所以在我看来,我必须逐块阅读它。我应该在这里使用H5Dread_chunk() 吗?
【问题讨论】:
是的,如果数据集不适合主内存,您将不得不逐块读取数据集。另外,请注意,您的数据集必须使用分块存储布局创建。然后您可以使用 hyperslabs(即切片)一次读取一个块。
所有这些都可以通过HDFql 大大简化。 HDFql 是一种高级语言,可让您摆脱处理 HDF5 文件的低级细节。
例如,您可以使用 HDFql 在 C 中执行以下操作:
// declare variables
char script[100];
int data[1024][1024];
int i;
// create a HDF5 file named 'my_file.h5' and use (i.e. open) it
hdfql_execute("CREATE AND 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);
}
有关如何在 C 中使用 HDFql 的其他示例可以在 here 找到。
【讨论】:
H5Dread() 是不是只能读取数据呢?