我目前正在探索HDF5。我读过"评价HDF5“线程中有趣的评论,我知道HDF5是存储数据的首选解决方案,但是如何查询呢?例如,假设我有一个包含一些标识符的大文件:是否有一种方法可以快速知道文件中是否存在给定的标识符?
发布于 2010-01-12 09:59:41
我认为答案是“不是直接的”。
以下是我认为您可以实现该功能的一些方法。
使用组:
可以以板蓝根的形式使用组的层次结构来存储数据。不过,这个比例可能不太好。
使用索引数据集:
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:
此纸 (以及此页面)描述如何使用位图索引在HDF数据集上执行复杂查询。我还没试过这个。
发布于 2013-08-27 14:48:35
H5Lexists是为此在HDF5 1.8.0中引入的:
H5L.html#Link-存在
您还可以使用HDF5 H5Literate迭代文件中的内容。
Link#Link-迭代
但是,您也可以通过尝试打开数据集手动检查以前的版本。我们使用这样的代码来处理任何版本的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
}发布于 2013-12-10 16:47:58
也许这篇论文会对你很有帮助。SQL.pdf
这就是你需要的吗?您可以使用SQL查询HDF5数据,这是一种声明性语言。
与FastQuery不同,在这项工作中没有索引,但是我们的组还提供了一个带有位图索引的开源版本。
此外,如果希望实时完成查询(尤其是聚合),则应考虑近似聚合或在线聚合。我还开发了一些直接在HDF5上工作的产品。
此外,对HDF5的一些查询可能比您在关系数据库中看到的要复杂得多。有些查询是面向数组的,而不是面向关系表的。只要谷歌"SciQL",你就可以找到一些复杂而独特的基于数组的数据模型的查询类型,这当然可以应用于HDF5。您需要执行这些查询吗?我还开发了一个产品来支持一些复杂的查询类型。
https://stackoverflow.com/questions/1686869
复制相似问题