2013-04-04 85 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文件的组/数据集树。