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

2023-10-04 14:26:21 +08:00
 iorilu

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

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

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

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

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

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

具体要求如下

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

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

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

这也是很正常的需求

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

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

但是, 我不喜欢 sql

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

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

我封装了一大堆函数,然后 ipython 启动时自动 import ,现在 ipython 几乎都可以当 shell 用了
icbmicbm
2023-10-04 18:24:03 +08:00
nuk
2023-10-04 18:32:08 +08:00
dbm 啊,B+tree ,性能吊打 sqlite 的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/978875

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX