Python版的LevelDB cpy-leveldb

webphp 13年前
     <p>cpy-leveldb是在leveldb(google 开源的高性能key-value数据库)的 C API 基础上开发的 python 绑定,目前支持leveldb 的 Put, Get, Delete, Write操作,以及 WriteBatch 的原子更新操作,WriteBatch 还可以通过将多个更新放到同一个 batch 里,在存在大量更新操作时,加速它们的执行,此外,cpy-leveldb 还支持快照(Snapshot),迭代器(Iterator),使 LevelDB 的功能最大化的在 Python 中得到实现。<br /> <br /> 项目地址:<a href="/misc/goto?guid=4958188598011415812" target="_blank">https://github.com/forhappy/cpy-leveldb</a></p>    <p>cpy-python使用例子:</p>    <pre class="brush:python; toolbar: true; auto-links: false;">>>> import leveldb  >>> db = leveldb.LevelDB("/tmp/leveldb")  >>> db.Put("1", "111")  >>> db.Put("2", "222")  >>> db.Put("3", "333")  >>> db.Get("1")  '111'  >>> db.Get("3")  '333'  >>> db.Get("2")  '222'  >>> batch = leveldb.WriteBatch()  >>> for i in xrange(20):  ...     batch.Put(str(i), "hello world %i" % i)  ...   >>> db.Get("2")  '222'  >>> db.Get("5")  ''  >>> db.Write(batch)  >>> db.Get("5")  'hello world 5'  >>> db.Get("2")  'hello world 2'  >>> iter = leveldb.Iterator(db)  Iterator_init executed.  >>> iter.First()  >>> iter.Key()  '0'  >>> iter.Value()  'hello world 0'  >>> iter.Last()  >>> iter.Key()  '9'  >>> iter.Value()  'hello world 9'  >>> iter.First()  >>> iter.Next()  >>> iter.Key()  '1'  >>> iter.Next()  >>> iter.Key()  '10'  >>> iter.Next()  >>> iter.Key()  '11'  >>> iter.Value()  'hello world 11'</pre>    <p></p>    <p><a href="/misc/goto?guid=4958183634494907073" target="_blank">Leveldb</a>是一个google实现的非常高效的kv数据库,目前的版本1.2能够支持billion级别的数据量了。 在这个数量级别下还有着非常高的性能,主要归功于它的良好的设计。特别是LSM算法。</p>    <p>LevelDB 是单进程的服务,性能非常之高,在一台4个Q6600的CPU机器上,每秒钟写数据超过40w,而随机读的性能每秒钟超过10w。</p>    <p>示例代码:</p>    <pre class="brush:cpp; toolbar: true; auto-links: false;">#include   #include "leveldb/include/db.h"    leveldb::DB* db;  leveldb::Options options;  options.create_if_missing = true;  leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);  assert(status.ok());    std::string value;  leveldb::Status s = db->Get(leveldb::ReadOptions(), key1, &value);  if (s.ok()) s = db->Put(leveldb::WriteOptions(), key2, value);  if (s.ok()) s = db->Delete(leveldb::WriteOptions(), key1);</pre>    <p></p>