먼저 bsddb (또는 새 이름 Oracle BerkeleyDB)는 더 이상 사용되지 않습니다.
LevelDB/RocksDB/bsddb의 경험이 wiredtiger보다 느리다는 이유로 나는 wiredtiger를 추천합니다.
wiredtiger는 mongodb의 저장소 엔진이므로 실제 프로덕션 환경에서 테스트되었습니다. 내 AjguDB 프로젝트 외부에는 파이썬에서 wiredtiger를 거의 사용하지 않거나 사용하지 않습니다. 나는 약 80GB의 wikidata와 개념을 저장하고 쿼리하기 위해 wiredtiger (AjguDB를 통해)를 사용한다.
다음은 python2 shelve 모듈을 모방 할 수있는 예제 클래스입니다. 여기
import json
from wiredtiger import wiredtiger_open
WT_NOT_FOUND = -31803
class WTDict:
"""Create a wiredtiger backed dictionary"""
def __init__(self, path, config='create'):
self._cnx = wiredtiger_open(path, config)
self._session = self._cnx.open_session()
# define key value table
self._session.create('table:keyvalue', 'key_format=S,value_format=S')
self._keyvalue = self._session.open_cursor('table:keyvalue')
def __enter__(self):
return self
def close(self):
self._cnx.close()
def __exit__(self, *args, **kwargs):
self.close()
def _loads(self, value):
return json.loads(value)
def _dumps(self, value):
return json.dumps(value)
def __getitem__(self, key):
self._session.begin_transaction()
self._keyvalue.set_key(key)
if self._keyvalue.search() == WT_NOT_FOUND:
raise KeyError()
out = self._loads(self._keyvalue.get_value())
self._session.commit_transaction()
return out
def __setitem__(self, key, value):
self._session.begin_transaction()
self._keyvalue.set_key(key)
self._keyvalue.set_value(self._dumps(value))
self._keyvalue.insert()
self._session.commit_transaction()
@saaj 대답에서 적응 테스트 프로그램 :
python test-wtdict.py & psrecord --plot=plot.png --interval=0.1 $!
다음 명령 줄을 사용하여
#!/usr/bin/env python3
import os
import random
import lipsum
from wtdict import WTDict
def main():
with WTDict('wt') as wt:
for _ in range(100000):
v = lipsum.generate_paragraphs(2)[0:random.randint(200, 1000)]
wt[os.urandom(10)] = v
if __name__ == '__main__':
main()
기본적으로, 이 키는 문자열이 될 수 wiredtiger 백엔드 사전입니다
다음 다이어그램을 생성했습니다.
$ du -h wt
60M wt
미리 쓰기 로그가 활성 는 :
$ du -h wt
260M wt
이것은 성능 튜닝없이 압축된다.
이
WiredTiger는 페타 바이트 테이블을 지원 최대 4GB 기록하고, 64 비트까지의 기록 번호 :
Wiredtiger는 알려진 제한 최근까지 문서는 다음에 업데이트 된이 없습니다.
http://source.wiredtiger.com/1.6.4/architecture.html
SQLite는 위대한 일을해야 내 경우는이 차트를 생성합니다. 그것을 사용하는 데 문제가 있습니까? DBMS는 작지만 DB 자체가 클 수 있습니다. https://stackoverflow.com/questions/14451624/will-sqlite-performance-degrade-if-the-database-size-is-greater-than-2-gigabytes – Himanshu
@Himanshu SQLite로 사용하는 것은 사실이 아닙니다. 'db [key] = value' 나'db.put ('key', 'value')'처럼 간단하지만 SQL을 대신 사용합니다 ... 그리고 TABLE이나 SELECT에 INSERT하는 것을 피하고 싶습니다. 그냥 간단한 키 : 값'db [key] = value' set/get. – Basj
데이터를 더 자세히 설명 할 수 있습니까? 100GB 무엇? 최소/중간/최대 값은 얼마나 큽니까? 얼마나 많은 키/값 쌍이 100GB를 구성합니까? –