【问题标题】:How to read a very large dataset from an HDF5 file?如何从 HDF5 文件中读取非常大的数据集?
【发布时间】:2020-05-28 19:01:57
【问题描述】:

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

【问题讨论】:

标签: c hdf5


【解决方案1】:

是的,如果数据集不适合主内存,您将不得不逐块读取数据集。另外,请注意,您的数据集必须使用分块存储布局创建。然后您可以使用 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() 是不是只能读取数据呢?
  • 如果数据集不是使用分块存储布局创建的,您仍然可以使用用于分块和 hyperslabs 的函数。这样做的问题是,由于数据集没有分块存储布局,HDF5 库将不得不读取整个数据集(如果您只对某个块感兴趣,这在性能方面不好 - 或者很少他们 - 数据集)。
  • 感谢@SOG。我理解为什么只有具有分块存储布局的数据集是可扩展的。但作为一名程序员,当存储布局是连续的时,为什么必须读取整个数据集才能访问例如几个字节,对我来说并不明显。
  • 我理解你的观点,但是,AFAIK,这就是 HDF5 库的行为方式(即,当数据集的存储布局没有被分块时,即使访问几个字节也必须完全读取数据集)。也许其他人可以提供额外的信息/反馈,以防图书馆实际上表现不同。
猜你喜欢
  • 2016-11-21
  • 2021-12-09
  • 2020-05-22
  • 2014-09-12
  • 2019-12-14
  • 1970-01-01
  • 2019-06-24
  • 2020-10-06
  • 2016-06-18
相关资源
最近更新 更多