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 · 2023-10-04 14:26:21 +08:00 · 4118 次点击
    这是一个创建于 402 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    一般都是通过各种配置文件比如什么 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  
       2023-10-04 14:46:47 +08:00
    pickle 不能满足要求吗
    vance123
        2
    vance123  
       2023-10-04 14:58:18 +08:00
    用 sqlite 自己封装一层就可以了吧
    shinession
        3
    shinession  
       2023-10-04 15:04:15 +08:00
    用 pickle zlib 序列化和反序列化, 可以直接存到 sqlite 里面, 不过好奇为什么不用 redis, 已经够简单了?
    buliugu
        4
    buliugu  
       2023-10-04 15:07:34 +08:00
    sqlite 它不香嘛?
    iorilu
        5
    iorilu  
    OP
       2023-10-04 15:18:19 +08:00
    @shinession 经常有本地存储的需要啊

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

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

    这也是很正常的需求

    至于 redis, 我如果开发一个单机软件, 我也不能指望客户端用户自己部署一个 redis 把, 就算可以弄个自动安装的, 也没必要
    iorilu
        13
    iorilu  
    OP
       2023-10-04 17:04:43 +08:00
    很多人说 sqlite

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

    但是, 我不喜欢 sql

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

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

    我封装了一大堆函数,然后 ipython 启动时自动 import ,现在 ipython 几乎都可以当 shell 用了
    icbmicbm
        19
    icbmicbm  
       2023-10-04 18:24:03 +08:00
    nuk
        20
    nuk  
       2023-10-04 18:32:08 +08:00
    dbm 啊,B+tree ,性能吊打 sqlite 的。
    est
        21
    est  
       2023-10-04 18:58:24 +08:00
    LZ 你看看 @aijam @nuk 说的这个吧。
    TheWalkingDead
        22
    TheWalkingDead  
       2023-10-04 20:40:25 +08:00
    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  
       2023-10-04 21:01:51 +08:00
    找冷门的或者自己写估计还不如 SQLite 或者 Redis 性能好,毕竟用的人那么多,基本上都优化到了极致。
    Pastsong
        24
    Pastsong  
       2023-10-04 21:05:24 +08:00 via Android   ❤️ 2
    @TheWalkingDead 老发 chatgpt 被容易被 ban 号
    Trim21
        25
    Trim21  
       2023-10-04 21:35:11 +08:00   ❤️ 1
    标准库里有一个 shelve
    shinession
        26
    shinession  
       2023-10-05 08:21:05 +08:00
    @TheWalkingDead 感谢, dbm 第一次听说, 原来还有这种用法
    SenLief
        27
    SenLief  
       2023-10-05 08:52:38 +08:00
    我写简单的持久化存储就用的是 dbm ,用 shelve 持久化的,不过最大的问题就是 dbm 在不同的系统和 python 版本下表现得不同。
    iorilu
        28
    iorilu  
    OP
       2023-10-05 09:54:40 +08:00
    @est 大概看了下, dbm 这东西是不是太老了点

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

    或者 RocksDB ,也有很多数据库在用,比如 TiDB 、Flink 等
    ZX576
        33
    ZX576  
       2023-10-12 17:43:37 +08:00
    lmdb +1
    jiayouzl
        34
    jiayouzl  
       2023-10-20 16:00:08 +08:00
    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   ·   实用小工具   ·   1885 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 16:28 · PVG 00:28 · LAX 08:28 · JFK 11:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.