Shelve:对象的持久化存储
目的: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,定制一个自己的类。
Shelve:对象的持久化存储的更多相关文章
- shelve -- 用来持久化任意的Python对象
这几天接触了Python中的shelve这个module,感觉比pickle用起来更简单一些,它也是一个用来持久化Python对象的简单工具.当我们写程序的时候如果不想用关系数据库那么重量级的东东去存 ...
- python笔记5 接口类抽象类 封装 反射 设计模式 模块 :random随机数 josn shelve持久化存储
接口类抽象类 接口类:接口类就是制定一个规则,让其他人按照我的规则去写程序. #!/usr/bin/env python from abc import ABCMeta,abstractmethod ...
- IOS开发-本地持久化存储sqlite应用
前言 需求描述 开发测试环境 FMDB介绍 创建工程 一.前言 上一章介绍了如何开发一个IOS应用的入门案例教程: 我的第一个IOS开发应用 本章主要将介 ...
- iOS数据持久化存储:归档
在平时的iOS开发中,我们经常用到的数据持久化存储方式大概主要有:NSUserDefaults(plist),文件,数据库,归档..前三种比较经常用到,第四种归档我个人感觉用的还是比较少的,恰恰因为用 ...
- ios开发之数据的持久化存储机制
IOS中数据的持久化保存这块内容,类似于Android中文件的几种常见的存储方式. 对于数据的持久化存储,ios中一般提供了4种不同的机制. 1.属性列表 2.对象归档 3.数据库存储(SQLite3 ...
- iOS开发——数据持久化Swift篇&使用Core Data进行数据持久化存储
使用Core Data进行数据持久化存储 一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成 ...
- Swift - 使用Core Data进行数据持久化存储
一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成数据,也能够将保存在数据库中的数据还原成对象. ...
- Vue-admin工作整理(十二):Vuex-插件(持久化存储)
Vuex可以支持插件形式,来处理指定业务,比如:持久化存储的插件(当每次刷新浏览器的时候store里面的参数都会被清除,因为它是存在内存中的,而不是存在本地的,有时候我们希望将一些东西存在本地) 插件 ...
- 11.scrapy框架持久化存储
今日概要 基于终端指令的持久化存储 基于管道的持久化存储 今日详情 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的 ...
随机推荐
- python框架-Django创建项目
创建项目 django-admin startproject douban//创建project cd douban python manage.py startapp books//创建app项目 ...
- MySql 分组函数
#二.分组函数/*功能:用作统计使用,又称为聚合函数或统计函数或组函数 分类:sum 求和.avg 平均值.max 最大值 .min 最小值 .count 计算个数 特点:1.sum.avg一般用于处 ...
- SQL Server中STATISTICS IO物理读和逻辑读的误区
SQL Server中STATISTICS IO物理读和逻辑读的误区 大家知道,SQL Server中可以利用下面命令查看某个语句读写IO的情况 SET STATISTICS IO ON 那么这个命令 ...
- Three中的动画实现-[three.js]
Table Of Content 动画原理 js中动画实现原理setInterval js中动画实现新方法requestAnimationFrame 一个示例 动画原理 动画的本质实际上就是快速地不断 ...
- Evolution of Image Classifiers,进化算法在神经网络结构搜索的首次尝试 | ICML 2017
论文提出使用进化算法来进行神经网络结构搜索,整体搜索逻辑十分简单,结合权重继承,搜索速度很快,从实验结果来看,搜索的网络准确率挺不错的.由于论文是个比较早期的想法,所以可以有很大的改进空间,后面的很大 ...
- java对于目录下的相关文件的单词操作
写入文件的目录.代码通过找目录下的文件,进行相关函数的操作.如果目录下面包含子目录.代码设有调用递归的方法,在寻找子目录下的文件 在进行相关的函数操作.函数主要是按用户输入的个数要求输出文件中出现次数 ...
- 2016蓝桥杯报纸页数(C++C组)
题目: 报纸页数X星球日报和我们地球的城市早报是一样的,都是一些单独的纸张叠在一起而已.每张纸印有4版.比如,某张报纸包含的4页是:5,6,11,12,可以确定它应该是最上边的第2张报纸.我们在太空中 ...
- String、StringBuffer、StringBuilder葫芦三兄弟
今年因为疫情的原因,本打算在读研期间好好做项目,写论文,在今年9月份能找个好工作,但现在迟迟不能开学,也无法正常的给导师打工,所以干脆就打算好好准备工(fan)作(wan)的事儿. 接触Java也有好 ...
- ConcurrentHashMap中节点数目并发统计的实现原理
前言: 前段时间又看了一遍ConcurrentHashMap的源码,对该并发容器的底层实现原理有了更进一步的了解,本想写一篇关于ConcurrentHashMap的put方法所涉及的初始化以及扩容操作 ...
- 用ASP.NET MVC5 +SQLSERVER2014搭建多层架构的数据库管理系统
用http://ASP.NET MVC5 +SQLSERVER2014搭建多层架构的数据库管理系统 背景:前段时间,给一家公司做外包(就是图标是朵菊花那家).为了尽快实现交付,网上四处寻找适合中小型企 ...