2009-11-06 63 views
14

我目前在探索HDF5。我读过线程“Evaluating HDF5”的有趣评论,并且我明白HDF5是存储数据的首选解决方案,但您如何查询呢?例如,假设我有一个包含一些标识符的大文件:有没有办法快速知道给定的标识符是否存在于文件中?搜索HDF5数据集

+0

Richard Corden回复中的哪个选项您使用过? – coelhudo 2011-11-19 23:31:10

+0

索引数据集。 – Pierre 2011-11-20 09:09:02

回答

6

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

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

使用群体:

组的层次结构可以在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 ::连载”。

HDF5-FastQuery:

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

0

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

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

通过标识符,我的意思是像一个唯一的名称,一个主键。这个例子描述了如何创建一个属性,但是它如何用于搜索呢? – Pierre 2009-11-06 13:20:03

4

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。你需要执行这些查询吗?我还开发了一种产品来支持一些复杂的查询类型。