搜索 HDF5 数据集

18

我目前正在探索HDF5。我已经阅读了线程“Evaluating HDF5”中有趣的评论,我知道HDF5是存储数据的选择解决方案,但如何查询它呢?例如,假设我有一个包含一些标识符的大文件:有没有快速知道某个给定的标识符是否存在于文件中的方法?


你使用了 Richard Corden 回复中的哪个选项? - coelhudo
4个回答

9
我认为答案是“不直接”。以下是一些实现此功能的方法。 使用分组: 可以使用基数树形式的分组层次结构来存储数据。但这可能不太可扩展。 使用索引数据集: HDF有一个引用类型,可以将一个主表链接到一个单独的索引表中。在写入主数据后,可以使用其他按其他键排序并带有引用的数据集。例如:
MainDataset (sorted on identifier)
0: { A, "C", 2 }
1: { B, "B", 1 }
2: { C, "A", 3 }

StringIndex
0: { "A", Reference ("MainDataset", 2) }
1: { "B", Reference ("MainDataset", 1) }
2: { "C", Reference ("MainDataset", 0) }

IntIndex
0: { 1, Reference ("MainDataset", 1) }
1: { 2, Reference ("MainDataset", 0) }
2: { 3, Reference ("MainDataset", 2) }

为了使用上述内容,需要在查找索引表中的字段时编写二分搜索。
内存索引:
根据数据集的大小,可能很容易使用内存索引,使用类似于“boost::serialize”的东西将其读/写到自己的数据集中。
HDF5-FastQuery:
这篇论文(以及这个页面)描述了使用位图索引在HDF数据集上执行复杂查询的方法。我没有尝试过这个方法。

5

H5Lexists是在HDF5 1.8.0中引入的:

http://www.hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-Exists

您还可以使用H5Literate迭代HDF5文件中的内容:

http://www.hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-Iterate

但您也可以通过尝试打开数据集来手动检查以前的版本。我们使用以下代码来处理任何版本的HDF5:

bool DoesDatasetExist(const std::string& rDatasetName)
{
#if H5_VERS_MAJOR>=1 && H5_VERS_MINOR>=8
    // This is a nice method for testing existence, introduced in HDF5 1.8.0
    htri_t dataset_status = H5Lexists(mFileId, rDatasetName.c_str(), H5P_DEFAULT);
    return (dataset_status>0);
#else
    bool result=false;
    // This is not a nice way of doing it because the error stack produces a load of 'HDF failed' output.
    // The "TRY" macros are a convenient way to temporarily turn the error stack off.
    H5E_BEGIN_TRY
    {
        hid_t dataset_id = H5Dopen(mFileId, rDatasetName.c_str());
        if (dataset_id>0)
        {
            H5Dclose(dataset_id);
            result = true;
        }
    }
    H5E_END_TRY;
    return result;
#endif
}

2
也许这篇论文对您非常有帮助。 http://www.cse.ohio-state.edu/~wayi/papers/HDF5_SQL.pdf 这是您需要的吗?您可以使用声明性语言SQL查询HDF5数据。
与FastQuery不同,此工作中没有索引,但我们的团队还提供了一个带有位图索引的开源版本。
此外,如果您想在实时完成查询(尤其是聚合)时,应考虑近似聚合或在线聚合。我也开发了一些直接在HDF5上运行的产品。
此外,与关系数据库中可能看到的某些查询相比,HDF5上的某些查询可能要复杂得多。一些查询是面向数组而不是关系表导向的。只需搜索“SciQL”,您就可以找到基于数组数据模型的一些复杂和独特的查询类型,这当然可以应用于HDF5。您需要执行那种类型的查询吗?我也开发了支持一些复杂查询类型的产品。

0

你所说的 标识符 是什么意思?如果你指的是一个 属性,请查看这个教程。在 C 语言中:

status = H5Aread(attr_id, mem_type_id, buf);
status = H5Awrite(attr_id, mem_type_id, buf);

2
通过标识符,我指的是像唯一名称、主键这样的东西。该示例描述了如何创建属性,但它如何用于搜索? (请注意,由于中英文语言的差异,翻译可能不是逐字逐句的) - Pierre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接