其实经常有本地存储一些信息数据的需求
一般都是通过各种配置文件比如什么 ini ,json ,toml ,yaml 等等东西
但配置文件必须完整存储, 并不适合存储大量信息
一般真存多点信息都用 sqlite 了
我想如果有一个类似 redis 的接口, 可能不需要那么复杂
但能做到键值存储, 随机访问, 性能还行的本地文件实现的库,那是很好的啊
具体要求如下
1
Tanix2 2023-10-04 14:46:47 +08:00
pickle 不能满足要求吗
|
2
vance123 2023-10-04 14:58:18 +08:00
用 sqlite 自己封装一层就可以了吧
|
3
shinession 2023-10-04 15:04:15 +08:00
用 pickle zlib 序列化和反序列化, 可以直接存到 sqlite 里面, 不过好奇为什么不用 redis, 已经够简单了?
|
4
buliugu 2023-10-04 15:07:34 +08:00
sqlite 它不香嘛?
|
5
iorilu OP |
6
aploium 2023-10-04 15:21:23 +08:00 via Android
diskcache
|
7
cmdOptionKana 2023-10-04 15:26:09 +08:00
PickleDB, TinyDB, ZODB
|
8
swulling 2023-10-04 15:33:50 +08:00 via iPhone
sqlite 足够简单了,没必要追求最简单的实现。
|
9
Kirscheis 2023-10-04 16:07:28 +08:00
我除了存 binary 数据之外的什么 kv 数据到磁盘都是直接 json.dump 就完事了,至今没遇到过性能瓶颈。。。binary 很大的时候会单独存文件里再用 kv 索引路径。
之前我有一个工控桌面程序项目自动生成的配置很多,加起来大概有一百多万条 kv 对,存盘的时候 json.dump 到磁盘每次也就半秒钟,几乎全是写磁盘时间,load 也是秒读。 如果是性能压力大到要高速缓存的话,应该没有比 redis 更简单的实现了。 |
10
aijam 2023-10-04 16:08:03 +08:00
|
12
iorilu OP @Kirscheis 需要完整存取用 json.dump 是没问题的
但我想要随机存取单个的值, 不想每次都完整 dump,load 这也是很正常的需求 至于 redis, 我如果开发一个单机软件, 我也不能指望客户端用户自己部署一个 redis 把, 就算可以弄个自动安装的, 也没必要 |
13
iorilu OP 很多人说 sqlite
我认为 sqlite 是很好, 不用安装, 单文件存储, 性能过得去 但是, 我不喜欢 sql 我认为正常情况下, 用名字-值这样的方式存储数据是最自然的, 本来数据在程序中就是有名字的, 直接用名字存储最自然, 就算是大量数据, 正常情况下也是有自然 key 的, 比如用户的 email,或者手机号, 都可以用来唯一索引, 都可以天然对应 kv 存储 |
14
tomczhen 2023-10-04 17:32:24 +08:00 via Android
可以看看 diskcache ,不过也是封装了一层 sqlite 。
|
16
wateryessence 2023-10-04 18:00:03 +08:00 via iPhone
|
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 用了 |
19
icbmicbm 2023-10-04 18:24:03 +08:00
考虑下 leveldb
https://pypi.org/project/plyvel/ |
20
nuk 2023-10-04 18:32:08 +08:00
dbm 啊,B+tree ,性能吊打 sqlite 的。
|
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 标准库中的一个简单键值存储模块,适用于基本的存储需求。根据实际需求,可以选择适合的库来进行键值存储。 |
23
shijingshijing 2023-10-04 21:01:51 +08:00
找冷门的或者自己写估计还不如 SQLite 或者 Redis 性能好,毕竟用的人那么多,基本上都优化到了极致。
|
24
Pastsong 2023-10-04 21:05:24 +08:00 via Android 2
@TheWalkingDead 老发 chatgpt 被容易被 ban 号
|
25
Trim21 2023-10-04 21:35:11 +08:00 1
标准库里有一个 shelve
|
26
shinession 2023-10-05 08:21:05 +08:00
@TheWalkingDead 感谢, dbm 第一次听说, 原来还有这种用法
|
27
SenLief 2023-10-05 08:52:38 +08:00
我写简单的持久化存储就用的是 dbm ,用 shelve 持久化的,不过最大的问题就是 dbm 在不同的系统和 python 版本下表现得不同。
|
28
iorilu OP |
30
thevita 2023-10-05 11:52:20 +08:00
1. 先找个能满足你需求的 kv store, 不限制语言,看看你需要的 feature , 需不需要 事物, 快照 等, 比如 rocksdb
2. 看看这个库有不有 python 的 bind 3. 如果没有,可以考虑 PyO3 自己简单撸一个 |
32
henix 2023-10-07 20:40:10 +08:00
可以试试 LMDB ,有很多开源项目都在用,比如 samba 、bind 、Caffe 等
或者 RocksDB ,也有很多数据库在用,比如 TiDB 、Flink 等 |
33
ZX576 2023-10-12 17:43:37 +08:00
lmdb +1
|
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) |