まず、bsddb(またはその名前がOracle BerkeleyDBの下にある)は非推奨ではありません。
LevelDB/RocksDB/bsddbの経験がwiredtigerより遅いので、私はwiredtigerを推奨しています。
wiredtigerはmongodbのストレージエンジンなので、実稼働環境で十分にテストされています。私のAjguDBプロジェクトの外では、Pythonで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は全く知られている制限はありません。
WiredTigerはペタバイトのテーブルをサポートし、64ビットまで4ギガバイト、およびレコード番号まで記録されます。
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-ギガバイト – Himanshu
@Himanshu SQLiteでの使用法は実際にはありません'db [key] = value'や' db.put( 'key'、 'value') 'のように単純ですが、代わりにSQLを使っています...そして、私はTABLEやSELECTにINSERTを避けたいのです。単純なキーです:value 'db [key] = value' set/get。 – Basj
データをより詳しく記述できますか? 100 GBの何?最小値/中央値/最大値の大きさはどれくらいですか? 100 GBを構成するキー/バリューペア数はいくつですか? –