目的: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,定制一个自己的类。

最新文章

  1. 在你的ASP.NET MVC中使用查找功能
  2. sql要点
  3. Eclipse汉化后怎么改回英文版(可切换中英文)
  4. 64位系统上使用PLSQL Dervloper解决方案
  5. 并查集+关系的传递(poj 1182)
  6. LeetCode Number of Digit One
  7. Redis - set类型操作
  8. BZOJ 2748: [HAOI2012]音量调节 dp
  9. 地大邀请赛d
  10. 解决IE8下不支持document.getElementsByClassName的方法
  11. Python3.2.3官方文档(中文版)
  12. react-create-app 构建react项目的流程以及需要注意的地方
  13. 定位现网环境中最耗费CPU的Java线程
  14. 音频标签化2:youtube-8m项目的训练、评估与测试
  15. 使用JAX-WS开发WebService
  16. python-day73--django-用户验证
  17. MVC001之mvcpager简单分页
  18. Linux学习10-CentOS搭建nginx负载均衡环境
  19. Linux安装bundle
  20. [转载][翻译]Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误[2]

热门文章

  1. API开放平台接口设计-------令牌方式
  2. linux 中的页缓存和文件 IO
  3. Sql Server数据库性能优化之索引
  4. Dome 多人人脸识别 face_recognition
  5. MFC 工具栏ToolBar
  6. 关于C#三层架构增删改查中的“登录”问题
  7. 使用xlsxwriter模块和xlrd模块操作Excel表格
  8. xmind转为markdown
  9. 「给产品经理讲JVM」:垃圾收集算法
  10. Go gRPC教程-服务端流式RPC(三)