Shelve:对象的持久化存储

2018 年 1 月 31 日 Python程序员

目的:Shelve模块为任意能够pickle的Python对象实现持久化存储,并提供一个类似字典的接口。

在关系型数据库还过于复杂的情境中,Shelve为你提供了Python对象持久化的另一种方案。

创建一个新的Shelf

使用shelf最简单的方法是使用DbfilenameShelf类,它使用dbm来存储数据。这个类的实例可以通过shelve.open直接创建:

如果想再次访问该数据,打开shelf并像字典一样使用它。

讲上面两段代码运行一下,得到下面输出:

dbm模块不支持多个应用同时写入同一个数据库,但是确实支持并发的读取操作。如果一个客户端不应该修改shelf,那么添加参数flag="r",告诉shelf以只读模式打开。

如果一个只读模式打开的客户端,试图修改shelve的数据,那么会报错。异常类型根据dbm底层选用的数据库的不同会有所不同。

回写

默认情况下,shelve不会追踪对象的修改。这意味着,如果从shelve取出的对象的一部分被修改了,那么你必须明确地重新写入整个对象,才能将这个修改保存起来。

在这个例子中,key1代表的字典没有重新写入,所以当这个shelf重新打开时,key1代表的字典没有发生变化。

为了让shelves自动监测并保存对对象的修改,打开时加上writeback参数。有了writeback参数,shelve会在内存中为所有从数据库中取出的对象做一份缓存,当shelf被关闭时,这些缓存对象也会自动写回到数据库中。

虽然这个参数减少了编程出错的几率,并且使得回写过程更加透明,但是也有些情况不宜使用这个参数。shelf打开后,使用到的缓存会消耗额外的内存,并且关闭时,回写的过程会拖慢程序。所有缓存的对象都会回写到数据库,而不是修改的才会回写,因为shelve并没有记录哪些对象修改了。如果你的程序中修改的数据只占使用数据的一小部分,那么这个参数可能有点太耗费资源了。

特定Shelf类型

前面的例子中,我们都使用的是shelve的默认参数。打开数据库我们都使用的是shelve.open,而没有指定数据库类型。通常情况下这就够了,但是也有一些场景,数据库格式很重要。在这些情况下,直接使用DbfilenameShelf类或者BsdDbShelf类,甚至继承于Shelf,定制一个自己的类。


英文原文:https://pymotw.com/3/shelve/index.html

译者:诗书塞外


登录查看更多
0

相关内容

深度玻尔兹曼机是一种以受限玻尔兹曼机为基础的深度学习模型,其本质是一种特殊构造的神经网络。深度玻尔兹曼机由多层受限玻尔兹曼机叠加而成的,不同于深度置信网络,深度玻尔兹曼机的中间层与相邻层是双向连接的。
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
117+阅读 · 2020年5月10日
【北京大学】面向5G的命名数据网络物联网研究综述
专知会员服务
36+阅读 · 2020年4月26日
【2020新书】C++20 特性 第二版,A Problem-Solution Approach
专知会员服务
58+阅读 · 2020年4月26日
深度神经网络实时物联网图像处理,241页pdf
专知会员服务
76+阅读 · 2020年3月15日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
亿级订单数据的访问与存储,怎么实现与优化?
码农翻身
16+阅读 · 2019年4月17日
Python奇淫技巧,5个数据可视化工具
机器学习算法与Python学习
7+阅读 · 2019年4月12日
文本分析与可视化
Python程序员
9+阅读 · 2019年2月28日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
消息队列技术点梳理(思维导图版)
架构文摘
3+阅读 · 2018年4月3日
基于 Storm 的实时数据处理方案
开源中国
4+阅读 · 2018年3月15日
浅谈浏览器 http 的缓存机制
前端大全
6+阅读 · 2018年1月21日
Neo4j 和图数据库起步
Linux中国
8+阅读 · 2017年12月20日
Spark的误解-不仅Spark是内存计算,Hadoop也是内存计算
Arxiv
35+阅读 · 2019年11月7日
Arxiv
8+阅读 · 2018年5月1日
Arxiv
6+阅读 · 2018年2月26日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
117+阅读 · 2020年5月10日
【北京大学】面向5G的命名数据网络物联网研究综述
专知会员服务
36+阅读 · 2020年4月26日
【2020新书】C++20 特性 第二版,A Problem-Solution Approach
专知会员服务
58+阅读 · 2020年4月26日
深度神经网络实时物联网图像处理,241页pdf
专知会员服务
76+阅读 · 2020年3月15日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
相关资讯
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
亿级订单数据的访问与存储,怎么实现与优化?
码农翻身
16+阅读 · 2019年4月17日
Python奇淫技巧,5个数据可视化工具
机器学习算法与Python学习
7+阅读 · 2019年4月12日
文本分析与可视化
Python程序员
9+阅读 · 2019年2月28日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
消息队列技术点梳理(思维导图版)
架构文摘
3+阅读 · 2018年4月3日
基于 Storm 的实时数据处理方案
开源中国
4+阅读 · 2018年3月15日
浅谈浏览器 http 的缓存机制
前端大全
6+阅读 · 2018年1月21日
Neo4j 和图数据库起步
Linux中国
8+阅读 · 2017年12月20日
Spark的误解-不仅Spark是内存计算,Hadoop也是内存计算
Top
微信扫码咨询专知VIP会员