python - 没有客户端/服务器的 key : value store in Python for possibly 100 GB of data,

标签 python dictionary serialization key-value key-value-store

<分区>

序列化一个小字典有很多方案:json.loads/json.dumps, pickle, shelveujson,甚至使用 sqlite

但是当处理可能有 100 GB 的数据时,就不可能再使用这种在关闭/序列化时可能会重写整个数据的模块。

redis 实际上不是一个选项,因为它使用客户端/服务器方案。

问题:哪个键值存储,无服务器,能够处理 100+ GB 的数据,在 Python 中经常使用?

我正在寻找具有标准“Pythonic”d[key] = value 语法的解决方案:

import mydb
d = mydb.mydb('myfile.db')
d['hello'] = 17          # able to use string or int or float as key
d[183] = [12, 14, 24]    # able to store lists as values (will probably internally jsonify it?)
d.flush()                # easy to flush on disk 

备注:BsdDB (BerkeleyDB) 似乎已被弃用。似乎有一个LevelDB for Python , 但它似乎并不出名 - 而我 haven't found可以在 Windows 上使用的版本。哪些是最常见的?


相关问题:Use SQLite as a key:value store , Flat file NoSQL solution

最佳答案

您可以使用 sqlitedict它为 SQLite 数据库提供键值接口(interface)。

SQLite limits page表示理论最大值为 140 TB,具体取决于 page_sizemax_page_count。但是,Python 3.5.2-2ubuntu0~16.04.4 (sqlite3 2.6.0) 的默认值为 page_size=1024max_page_count=1073741823。这提供了约 1100 GB 的最大数据库大小,可满足您的要求。

您可以像这样使用这个包:

from sqlitedict import SqliteDict

mydict = SqliteDict('./my_db.sqlite', autocommit=True)
mydict['some_key'] = any_picklable_object
print(mydict['some_key'])
for key, value in mydict.items():
    print(key, value)
print(len(mydict))
mydict.close()

更新

关于内存使用。 SQLite 不需要你的数据集来适应 RAM。默认情况下,它最多缓存 cache_size 页面,这几乎是 2MiB(与上面相同的 Python)。这是您可以用来检查您的数据的脚本。运行前:

pip install lipsum psutil matplotlib psrecord sqlitedict

sqlitedct.py

#!/usr/bin/env python3

import os
import random
from contextlib import closing

import lipsum
from sqlitedict import SqliteDict

def main():
    with closing(SqliteDict('./my_db.sqlite', autocommit=True)) as d:
        for _ in range(100000):
            v = lipsum.generate_paragraphs(2)[0:random.randint(200, 1000)]
            d[os.urandom(10)] = v

if __name__ == '__main__':
    main()

./sqlitedct.py & psrecord --plot=plot.png --interval=0.1 $! 一样运行它。在我的例子中,它产生了这个图表: chart

和数据库文件:

$ du -h my_db.sqlite 
84M my_db.sqlite

关于python - 没有客户端/服务器的 key : value store in Python for possibly 100 GB of data,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47233562/

相关文章:

python - 使用 TxK 列索引数组从 TxN numpy 数组中选取 TxK numpy 数组

python - 在 PayPal REST API 中,如何从新执行的账单协议(protocol)中获取付款人信息?

python - 匹配两个字典中的键,并使用匹配的键和两个关联值创建新字典

java - 通过文件/网络传递对象实现而不是单独的数据

c# - 使用 Protobuf-net 序列化 MultiValueDictionary(string,string) 时出错

python - 绘制正方形 Cartopy map

javascript - 键:value pairs in javascript的排序字典

python - if-else 理解字典在 python3 中不起作用

java - java为什么不用@Serializable注解替换Serializable

python - spark 1.3.0、python、avro 文件、在 spark-defaults.conf 中设置的驱动程序类路径,但从属设备看不到