简单的基于文件的KV存储
kvfile的Python项目详细描述
kvfile
一个简单的基于文件的键值存储,因此可以以较小的内存占用来容纳大型数据集。
在内部将使用更快的leveldb
作为存储后端,如果leveldb
不可用,则使用sqlite3
作为回退。
基本知识
任何使用python的人都应该熟悉这个api。
它公开get
、keys
和items
用于从数据库读取数据,以及set
用于在数据库中设置值。
初始化
importdatetimeimportdecimalfromkvfileimportKVFilekv=KVFile()
设定值
kv.set('s','value')kv.set('i',123)kv.set('d',datetime.datetime.fromtimestamp(12325))kv.set('n',decimal.Decimal('1234.56'))kv.set('ss',set(range(10)))kv.set('o',dict(d=decimal.Decimal('1234.58'),n=datetime.datetime.fromtimestamp(12325)))
获取值
assertkv.get('s')=='value'assertkv.get('i')==123assertkv.get('d')==datetime.datetime.fromtimestamp(12325)assertkv.get('n')==decimal.Decimal('1234.56')assertkv.get('ss')==set(range(10))assertkv.get('o')==dict(d=decimal.Decimal('1234.58'),n=datetime.datetime.fromtimestamp(12325))
列出值
keys()
和items()
方法返回一个生成器,生成有效流处理的值。
返回的数据按键升序(默认)排序
assertlist(kv.keys())==['d','i','n','o','s','ss']assertlist(kv.items())==[('d',datetime.datetime.fromtimestamp(12325)),('i',123),('n',decimal.Decimal('1234.56')),('o',{'d':decimal.Decimal('1234.58'),'n':datetime.datetime.fromtimestamp(12325)}),('s','value'),('ss',{0,1,2,3,4,5,6,7,8,9})]
对于要按降序排序的keys()
和items()
方法,将reverse
参数设置为true。
批量插入数据
当批量插入数据时,sqlite db后端可能非常慢。可以使用insert方法高效地进行批量插入。
kv.insert(((str(i),':{}'.format(i))foriinrange(50000)))
批处理大小默认为1000,您应该根据数据大小和可用内存对其进行修改。
kv.insert(((str(i),':{}'.format(i))foriinrange(50000)),batch_size=40000)
如果要从生成器插入数据并需要使用插入的数据,请使用insert_generator
方法:
forkey,valueinkv.insert_generator(((str(i),':{}'.format(i))foriinrange(50)),batch_size=10):print(key,value)
安装leveldb
在基于debian的linux上:
$ apt-get install libleveldb-dev libleveldb1
在基于Alpine的Linux上:
$ apk --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --update add leveldb leveldb-dev
在OS X上:
$ brew install leveldb