2013-04-04 31 views
0

我需要一個在線目錄的數據庫;如果每個產品可能有一個數據集。和一個簡單的數據庫;這就是我喜歡h5py。在h5py或類似的分層數據庫中快速搜索

方法visititems對大文件來說它不是快速的。


import h5py 

#in memory database. Not relevant for this question, same speed. Yes. 
database = h5py.File('db01h5', driver='core', backing_store=False) 

#example of 10000 datasets with a deep of 4 group, file/x10/x10/x10/x10dset 
for v1 in ('abcdefghij'): 
    for v2 in ('abcdefghij'): 
     for v3 in ('abcdefghij'): 
      for v4 in (''): 

       database['/' + v1 + '/' + v2 + '/' + v3 + '/' + 'dset' + v4] = (1, 2, 3) 


def fu01(a1, a2): 
    pass 

#visititems applies function fu01(name, object) to each group and dataset 
database.visititems(fu01) 

使用函數不計算任何內容(傳遞)「database.visititems(fu01)」需要5秒鐘。用基本參數過濾需要x2。

我的問題是我如何搜索到一個大型或非常大的h5py數據庫過濾特性,並且非常快(對於10.000個產品,小於0.1秒)。

是h5py/hdf5的正確方法,還是需要像sqlite3這樣的sql數據庫?

或者,當需要速度時,所有的都必須在同一個數據集中?將樹路徑作爲一個元素。例如:

database['dataset'] = [['root/categorie/subcategorie/productname'], ['2'], ['10$'], ['blue']] 

然後通過一個「列」(高級切片)過濾所有產品。

我是新來的數據庫,在這個時候我不喜歡在內存中工作的數據庫,如reddis或類似的;因爲很難同步數據中的更改。但如果沒有其他解決方案...

回答

1

這不是什麼hdf被優化做。它旨在有效地存儲少量非常大的數據集,並在大量非常小的數據集上發生故障。

我認爲使用某種類型的實際數據庫(無論是關係型還是非關係型)會更好。

您可能還想構建自己的樹實現,關於visititems的緩慢行爲是步行hdf文件的組/數據集樹。