2009-11-06 61 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。你需要執行這些查詢嗎?我還開發了一種產品來支持一些複雜的查詢類型。