我目前在探索HDF5。我读过线程“Evaluating HDF5”的有趣评论,并且我明白HDF5是存储数据的首选解决方案,但您如何查询呢?例如,假设我有一个包含一些标识符的大文件:有没有办法快速知道给定的标识符是否存在于文件中?搜索HDF5数据集
回答
我认为答案是“不直接”。
以下是我认为可以实现该功能的一些方法。
使用群体:
组的层次结构可以在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:
你是什么意思标识?如果您的意思是属性,请检查this tutorial。在C:
status = H5Aread(attr_id, mem_type_id, buf);
status = H5Awrite(attr_id, mem_type_id, buf);
通过标识符,我的意思是像一个唯一的名称,一个主键。这个例子描述了如何创建一个属性,但是它如何用于搜索呢? – Pierre 2009-11-06 13:20:03
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
}
也许这篇论文对你很有帮助。 http://www.cse.ohio-state.edu/~wayi/papers/HDF5_SQL.pdf
这是你所需要的?您可以使用SQL来查询HDF5数据,这是一种声明性语言。
与FastQuery不同,本工作中没有索引,但我们的组还提供了一个带位图索引的开源版本。此外,如果您想要实时完成查询(尤其是聚合),则应考虑近似聚合或在线聚合。我还开发了一些直接在HDF5上工作的产品。此外,对HDF5的某些查询可能比您在关系数据库中看到的要复杂得多。一些查询是面向数组的,而不是关系数据表。只需谷歌“SciQL”,那么你可以找到一些复杂和独特的基于数组的数据模型的查询类型,当然可以应用于HDF5。你需要执行这些查询吗?我还开发了一种产品来支持一些复杂的查询类型。
- 1. Chunked HDF5数据集和slabsize
- 2. 搜索大型数据集
- 3. Python搜索数据集
- 4. 全文搜索数据集
- 5. 搜索从数据集中
- 6. 使用H5PY在HDF5数据库中搜索属性值
- 7. 将数据集转换为HDF5数据集
- 8. 调整Julia的HDF5数据集
- 9. 如何存储辞典HDF5数据集
- 10. 阅读HDF5数据集与熊猫
- 11. R hdf5数据集写入不正确?
- 12. 写一个boost :: multi_array到hdf5数据集
- 13. mmap hdf5数据集在C/C++
- 14. 打开hdf5字符串数据集
- 15. HDF5数据集中事件的链接
- 16. 基于2D条件对大型3D HDF5数据集进行子集化索引
- 17. 如何高效地搜索子数据集的大数据集?
- 18. 如何搜索数据集建议?
- 19. 在大型数据集中搜索
- 20. 在Rails中搜索大型数据集
- 21. 从xml文件中搜索数据集
- 22. 使用Linq搜索多项数据集
- 23. 在数据子集内搜索 - Solr
- 24. ios coredata搜索大型数据集
- 25. 使用twitter搜索API收集数据
- 26. 搜索ASP.NET SQL数据集邮编
- 27. 如何搜索大型XML数据集?
- 28. 搜索数据
- 29. 搜索数据
- 30. 集成Hadoop和HDF5
Richard Corden回复中的哪个选项您使用过? – coelhudo 2011-11-19 23:31:10
索引数据集。 – Pierre 2011-11-20 09:09:02