2013-09-06 11 views
0

BDB를 시계열 데이터 저장소로 사용하고이 값 이후의 마이크로 초를 키 값으로 사용하려고합니다. BTREE를 데이터 저장소 유형으로 사용하고 있습니다.(bsddb3을 사용하는) 파이썬에서 Berkeley DB의 정수 키를 사용하십시오.

그러나 정수 키를 저장하려고하면 bsddb3은 TypeError: Integer keys only allowed for Recno and Queue DB's이라는 오류 메시지를 표시합니다.

가장 좋은 해결 방법은 무엇입니까? 문자열로 저장할 수는 있지만 불필요하게 느려질 것입니다.

BDB 자체가 모든 종류의 데이터를 처리 할 수 ​​있다고 가정 할 때 제한이있는 이유는 무엇입니까? bsddb3 구현을 해킹 할 수 있습니까? 아무도 다른 방법을 사용 했나요?

답변

-1

글쎄, 해결 방법은 없습니다. 하지만 당신은 str 또는 repr를 사용하는 두 가지 방법 문자열로

  1. 스토어 정수를 사용할 수 있습니다. int가 크면 문자열 형식을 사용할 수도 있습니다.

  2. 데이터를 저장하고 검색하는 데 cPickle/pickle 모듈을 사용하십시오. 기본 유형 이외의 데이터 유형이있는 경우이 방법이 좋습니다. 기본 int들과 float의 경우이 사실은 느리고 bsddb 데이타 정수의 종류 그것이 정수와를 표현하는 방법을 알고하지 않기 때문에 당신은 정수를 저장할 수 없습니다 만 저장하는 문자열

+0

내 대답을 참조하십시오. – amirouche

1

보다 더 많은 공간을 차지.

정수를 문자열로 변환하면 bsddb의 키 사전 식 순서가 깨집니다 (10 > 2). 문자열은 "10" < "2"입니다.

파이썬 struct을 사용하여 정수를 문자열로 (또는 파이썬 3에서 바이트로) 변환하여 bsddb에 저장해야합니다. bigendian 포장을 사용해야하거나 주문이 잘못되었습니다.

그런 다음 bsddb의 Cursor.set_range(key)을 사용하여 주어진 시간 조각에서 정보를 쿼리 할 수 ​​있습니다.

예를 들어, Cursor.set_range(struct.unpack('>Q', 123456789))은 123456789에서 발생하는 짝수의 키나 그 이후의 첫 번째 키에서 커서를 설정합니다.