V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
iorilu
V2EX  ›  Python

Python 有没有好用的本地文件实现的 key, value 存储

  •  
  •   iorilu · 206 天前 · 3645 次点击
    这是一个创建于 206 天前的主题,其中的信息可能已经有所发展或是发生改变。

    其实经常有本地存储一些信息数据的需求

    一般都是通过各种配置文件比如什么 ini ,json ,toml ,yaml 等等东西

    但配置文件必须完整存储, 并不适合存储大量信息

    一般真存多点信息都用 sqlite 了

    我想如果有一个类似 redis 的接口, 可能不需要那么复杂

    但能做到键值存储, 随机访问, 性能还行的本地文件实现的库,那是很好的啊

    具体要求如下

    1. 支持随机 key ,value 存储访问
    2. 没有任何安装
    3. 只是用单文件存储内容, 方便复制备份等
    4. 性能类似那种本地数据库比如 sqlite , 当然快点更好
    34 条回复    2023-10-20 16:00:08 +08:00
    Tanix2
        1
    Tanix2  
       206 天前
    pickle 不能满足要求吗
    vance123
        2
    vance123  
       206 天前
    用 sqlite 自己封装一层就可以了吧
    shinession
        3
    shinession  
       206 天前
    用 pickle zlib 序列化和反序列化, 可以直接存到 sqlite 里面, 不过好奇为什么不用 redis, 已经够简单了?
    buliugu
        4
    buliugu  
       206 天前
    sqlite 它不香嘛?
    iorilu
        5
    iorilu  
    OP
       206 天前
    @shinession 经常有本地存储的需要啊

    比如我想开发一个桌面软件, 需要存数据再本地, 但是不想用 sql
    kv 存储可能足够满足需求, 而且更简单
    奇怪的事, 居然这么久没人开发这种库吗
    aploium
        6
    aploium  
       206 天前 via Android
    diskcache
    cmdOptionKana
        7
    cmdOptionKana  
       206 天前
    PickleDB, TinyDB, ZODB
    swulling
        8
    swulling  
       206 天前 via iPhone
    sqlite 足够简单了,没必要追求最简单的实现。
    Kirscheis
        9
    Kirscheis  
       206 天前
    我除了存 binary 数据之外的什么 kv 数据到磁盘都是直接 json.dump 就完事了,至今没遇到过性能瓶颈。。。binary 很大的时候会单独存文件里再用 kv 索引路径。
    之前我有一个工控桌面程序项目自动生成的配置很多,加起来大概有一百多万条 kv 对,存盘的时候 json.dump 到磁盘每次也就半秒钟,几乎全是写磁盘时间,load 也是秒读。
    如果是性能压力大到要高速缓存的话,应该没有比 redis 更简单的实现了。
    iorilu
        11
    iorilu  
    OP
       206 天前
    @aploium 好像不错, 是本地文件实现的 kv, 回头仔细研究下
    iorilu
        12
    iorilu  
    OP
       206 天前
    @Kirscheis 需要完整存取用 json.dump 是没问题的

    但我想要随机存取单个的值, 不想每次都完整 dump,load

    这也是很正常的需求

    至于 redis, 我如果开发一个单机软件, 我也不能指望客户端用户自己部署一个 redis 把, 就算可以弄个自动安装的, 也没必要
    iorilu
        13
    iorilu  
    OP
       206 天前
    很多人说 sqlite

    我认为 sqlite 是很好, 不用安装, 单文件存储, 性能过得去

    但是, 我不喜欢 sql

    我认为正常情况下, 用名字-值这样的方式存储数据是最自然的, 本来数据在程序中就是有名字的, 直接用名字存储最自然, 就算是大量数据, 正常情况下也是有自然 key 的, 比如用户的 email,或者手机号, 都可以用来唯一索引, 都可以天然对应 kv 存储
    tomczhen
        14
    tomczhen  
       206 天前 via Android
    可以看看 diskcache ,不过也是封装了一层 sqlite 。
    chendy
        15
    chendy  
       206 天前
    @iorilu #12 一个单表简单封装一下就出来了,何来不喜欢 sql 捏…
    wateryessence
        16
    wateryessence  
       206 天前 via iPhone
    swulling
        17
    swulling  
       206 天前 via iPhone
    @iorilu sqlite 你建一个表,key- value 不完了
    NoOneNoBody
        18
    NoOneNoBody  
       206 天前   ❤️ 2
    可以弄个 class ,然后__getattr__, __setattr__,__dict__,把 sql 的增删改查写进去,反正位置也固定、sql 语句也固定,无非就是 select 和 insert or replace ,写死了,外部就根本不用理会

    实例化这个 class ,直接 obj.abc+obj.cba 就是了

    我封装了一大堆函数,然后 ipython 启动时自动 import ,现在 ipython 几乎都可以当 shell 用了
    icbmicbm
        19
    icbmicbm  
       206 天前
    nuk
        20
    nuk  
       206 天前
    dbm 啊,B+tree ,性能吊打 sqlite 的。
    est
        21
    est  
       206 天前
    LZ 你看看 @aijam @nuk 说的这个吧。
    TheWalkingDead
        22
    TheWalkingDead  
       206 天前
    DiskCache 和 dbm 都是 Python 中用于键值存储的库,但它们在实现和使用方面有一些区别。以下是对 DiskCache 和 dbm 的比较:

    实现方式:
    - DiskCache:DiskCache 是一个独立的键值存储库,使用本地文件系统作为存储。它提供了持久化的缓存功能,并支持多种数据类型(如字符串、字节、JSON 、pickle 等)。DiskCache 使用 SQLite 作为底层存储引擎,并通过文件索引和缓存管理来提供高效的存储和检索。
    - dbm:dbm 是 Python 标准库中的一个模块,提供了简单的键值存储接口。它使用本地文件作为存储,并提供了几种实现,如 dbm.gnu 、dbm.ndbm 和 dbm.dumb 。dbm 实现依赖于不同的底层库,例如 GDBM 、NDBM 和 DumbDBM ,它们在功能和性能方面可能有所不同。

    功能和灵活性:
    - DiskCache:DiskCache 提供了更多的功能和灵活性。它支持缓存过期、最大缓存大小、存储压缩、读写锁等功能,以及自定义的存储和序列化机制。DiskCache 还可以作为一个独立的缓存系统,用于处理大量的数据,并提供了更高级的缓存管理功能。
    - dbm:dbm 提供了简单的键值存储功能,适用于基本的存储需求。它的功能相对有限,不支持缓存过期、存储压缩等高级功能。dbm 实现通常用于简单的应用程序,不需要复杂的存储和检索需求。

    性能:
    - DiskCache:DiskCache 通过使用 SQLite 作为底层存储引擎,并提供索引和缓存管理等优化技术,可以提供较高的性能和效率。
    - dbm:dbm 的性能取决于底层实现。不同的 dbm 实现可能会有一些性能差异,因此在选择时需要考虑具体的需求。

    综上所述,DiskCache 提供了更丰富的功能和灵活性,并通过优化的存储引擎提供较高的性能。而 dbm 是 Python 标准库中的一个简单键值存储模块,适用于基本的存储需求。根据实际需求,可以选择适合的库来进行键值存储。
    shijingshijing
        23
    shijingshijing  
       206 天前
    找冷门的或者自己写估计还不如 SQLite 或者 Redis 性能好,毕竟用的人那么多,基本上都优化到了极致。
    Pastsong
        24
    Pastsong  
       206 天前 via Android   ❤️ 2
    @TheWalkingDead 老发 chatgpt 被容易被 ban 号
    Trim21
        25
    Trim21  
       206 天前   ❤️ 1
    标准库里有一个 shelve
    shinession
        26
    shinession  
       205 天前
    @TheWalkingDead 感谢, dbm 第一次听说, 原来还有这种用法
    SenLief
        27
    SenLief  
       205 天前
    我写简单的持久化存储就用的是 dbm ,用 shelve 持久化的,不过最大的问题就是 dbm 在不同的系统和 python 版本下表现得不同。
    iorilu
        28
    iorilu  
    OP
       205 天前
    @est 大概看了下, dbm 这东西是不是太老了点

    我初步感觉 diskcache 可能实用性更好点, 下次项目可能会用这个
    iorilu
        29
    iorilu  
    OP
       205 天前
    @icbmicbm 看了下是 google 搞得啊, 功能好像还行, 不过 2 年没更新了, 不知是何原因
    thevita
        30
    thevita  
       205 天前
    1. 先找个能满足你需求的 kv store, 不限制语言,看看你需要的 feature , 需不需要 事物, 快照 等, 比如 rocksdb
    2. 看看这个库有不有 python 的 bind
    3. 如果没有,可以考虑 PyO3 自己简单撸一个
    icbmicbm
        31
    icbmicbm  
       203 天前 via iPhone
    @iorilu 是两年没更新了 但是依赖 leveldb 的东西不少,估计只是没啥新功能吧
    henix
        32
    henix  
       203 天前
    可以试试 LMDB ,有很多开源项目都在用,比如 samba 、bind 、Caffe 等

    或者 RocksDB ,也有很多数据库在用,比如 TiDB 、Flink 等
    ZX576
        33
    ZX576  
       198 天前
    lmdb +1
    jiayouzl
        34
    jiayouzl  
       190 天前
    import pickle

    # 使用 pickle 模块将数据对象保存到文件
    data1 = {
    'a': [1, 2.0, 3, 4 + 5j],
    'b': ('string', u'Unicode string'),
    'c': None
    }

    list1 = [1, 2, 3, 4, 5]
    list1.extend((6, 7, 8, 9, 0))

    #print(list1)

    with open('data.plk', 'wb') as f:
    pickle.dump(data1, f)
    pickle.dump(list1, f)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1014 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:56 · PVG 02:56 · LAX 11:56 · JFK 14:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.