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

229 天前
 iorilu

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

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

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

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

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

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

具体要求如下

  1. 支持随机 key ,value 存储访问
  2. 没有任何安装
  3. 只是用单文件存储内容, 方便复制备份等
  4. 性能类似那种本地数据库比如 sqlite , 当然快点更好
3704 次点击
所在节点    Python
34 条回复
est
229 天前
LZ 你看看 @aijam @nuk 说的这个吧。
TheWalkingDead
229 天前
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
229 天前
找冷门的或者自己写估计还不如 SQLite 或者 Redis 性能好,毕竟用的人那么多,基本上都优化到了极致。
Pastsong
229 天前
@TheWalkingDead 老发 chatgpt 被容易被 ban 号
Trim21
229 天前
标准库里有一个 shelve
shinession
228 天前
@TheWalkingDead 感谢, dbm 第一次听说, 原来还有这种用法
SenLief
228 天前
我写简单的持久化存储就用的是 dbm ,用 shelve 持久化的,不过最大的问题就是 dbm 在不同的系统和 python 版本下表现得不同。
iorilu
228 天前
@est 大概看了下, dbm 这东西是不是太老了点

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

或者 RocksDB ,也有很多数据库在用,比如 TiDB 、Flink 等
ZX576
221 天前
lmdb +1
jiayouzl
213 天前
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)

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

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

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

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

© 2021 V2EX