搜索HDF5数据集

时间:2009-11-06 10:59:19

标签: search hdf5

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

4 个答案:

答案 0 :(得分:8)

我认为答案是“不直接”。

以下是我认为您可以实现此功能的一些方法。

使用群组:

可以以Radix Tree的形式使用组的层次结构来存储数据。这可能不会很好地扩展。

使用索引数据集:

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”这样的内存索引可以很容易地读取/写入自己的数据集。

<强> HD​​F5-FastQuery:

paper(以及此page)描述了使用位图索引对HDF数据集执行复杂查询。我没试过这个。

答案 1 :(得分:5)

在HDF5 1.8.0中引入了

H5Lexists

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 :(得分:2)

也许这篇论文对你很有帮助。 http://www.cse.ohio-state.edu/~wayi/papers/HDF5_SQL.pdf

这是你需要的吗?您可以使用SQL(一种声明性语言)查询HDF5数据。

与FastQuery不同,这项工作中没有索引,但我们的小组还提供了一个带位图索引的开源版本。

此外,如果要实时完成查询(尤其是聚合),则应考虑近似聚合或在线聚合。我还开发了一些直接用于HDF5的产品。

此外,对HDF5的一些查询可能比您在关系数据库中看到的要复杂得多。有些查询是面向数组的,而不是面向关系表的。只需谷歌“SciQL”,然后你就可以找到一些基于阵列的数据模型的复杂和独特的查询类型,它们当然可以应用于HDF5。你需要执行那些查询吗?我还开发了一个产品来支持那里的一些复杂的查询类型。

答案 3 :(得分:0)

标识符是什么意思?如果您指的是属性,请检查this tutorial。在C:

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