2013-04-04 2 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) 

아무 것도 평가하지 않는 함수 (pass)의 경우 "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 파일의 그룹/데이터 세트 트리를 걷는 것입니다.