http://blog.csdn.net/chen_lovelotus/article/details/7233293

一、Python对象持久化方法

目前为止,据我所知,在python中对象持久化有以下几种方法:

1. 使用(dbhash/bsddb, dbm, gdbm, dumbdbm 等)以及它们的"管理器"( anydbm )。只提供了 Python 字 
符串的永久性储存. 提供一个类似字典和文件的对象,可以完成字符串的永久性存储。

2. 使用marshal和pickle来序列化python对象,并具备存储到介质上的功能。两者的区别在于:marshal只能处理简单的Python对象,包括数字、序列、映射、以及代码对象;而pickle还可以处理递归对象,被不同地方多次引用的对象,以及用户定义的类和实例。其中,pickle有一个C语言实现的版本——cPickle,具有更高的效率,建议使用cPickle。

3. 虽然pickle提供非常强大的功能了,已经可以满足我们大部分的需求了,但是,人类的需求是无止境的,光序列化不行啊,只用 pickle 不能解决命名和查找 pickle 文件这样的问题,要是可以对序列化的对象提供管理功能,支持并发访问就好了。因此,人们发明了shelve模块,它是前两者的综合。shelve模块使用anydbm模块寻找合适的DBM模块,然后使用cPickle来完成对象存储转换过程。shelve模块允许对数据库文件进行并发的读访问,但不允许共享读/写访问。

4. 还有一种方案,是在IBM的网站上看到的。那就是ZODB了。ZODB比简单的 pickle 文件更健壮以及更具有可伸缩性。ZODB是一个针对Python的Z对象数据库,是一个健壮的、多用户的和面向对象的数据库系统,它能够存储和管理任意复杂的 Python 对象,并支持事务操作和并发控制。其实,ZODB也依靠Python 的本机序列化能力,而且要有效地使用 ZODB,必须充分了解 pickle。

5. 最后一只知道的解决持久性问题的方法是 Prevayler,PyPerSyst 将整个对象系统保存在内存中,并通过不时地将系统快照 pickle 到磁盘以及维护一个命令日志(通过此日志可以重新应用最新的快照)来提供灾难恢复。所以,尽管使用 PyPerSyst 的应用程序受到可用内存的限制,但好处是本机对象系统可以完全装入到内存中,因而速度极快,而且实现起来要比如 ZODB 这样的数据库简单,ZODB 允许对象的数目比同时在能内存中所保持的对象要多。

背景知识:它最初是用 Java 实现的。后来,一群 Python 程序员将 Prevayler 移植到了 Python 上,另起名为 PyPerSyst,由 SourceForge 托管。Prevayler/PyPerSyst 概念也是建立在 Java 和 Python 语言的本机序列化能力之上。

6. 我今天又发现了一个模块Durus,非常好的模块,支持多线程并发操作,支持回滚操作。不过安装的时候没装上,好像是缺少vc里面文件似的,不管了。

二、我该如何选择

上面5种方案是我在综合相关资料汇总的,那么现在轮到如何选择。我选择的一个原则:“懒”,怎么讲,就是尽量在完成任务的情况下,降低复杂度和将来的兼容性。第五种方案对我不太适用,全部load到内存基本不可能,所以我先暂时选第四种方案吧,方便读取,使用对象数据库对于我的项目应该是有好处的。

参考性的意见,我认为得看自己定了,如果想简单,用pickle就能解决问题。我也想用pickle的,可是一大堆对象,还需要检索方便,当然选择第四种方案。其实第三种方案也适合我的,如果时间充裕的话,我还想第四种方案和第三种做一个实验,比较一下,再写一篇文章给大家参考。

参考资料:

1. Python 持久性管理 http://www.ibm.com/developerworks/cn/linux/l-pypers/

2. shelve — Python object persistence http://docs.python.org/library/shelve.html

3. Core Python Programming, Second Edition   By Wesley J. Chun

4. ZODB 入门 http://www.ibm.com/developerworks/cn/aix/library/au-zodb/?S_TACT=105AGX52&S_CMP=tec-csdn

python对象序列化或持久化的方法的更多相关文章

  1. python对象序列化之pickle

    本片文章主要是对pickle官网的阅读记录. The pickle module implements binary protocols for serializing and de-serializ ...

  2. python对象序列化pickle

    import pickle class A: users = {} c = 1 def get_self(self): return self def n(self): return 1 def pi ...

  3. cPickle对python对象进行序列化,序列化到文件或内存

    pickle模块使用的数据格式是python专用的,并且不同版本不向后兼容,同时也不能被其他语言说识别.要和其他语言交互,可以使用内置的json包 cPickle可以对任意一种类型的python对象进 ...

  4. python 模块 - 序列化 json 和 pickle

    1,引入 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval ...

  5. JAVA的序列化和持久化的区别与联系

      持久化(Persistence) 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘).持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中.XML数据文 ...

  6. java 对象序列化与反序列化

    Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化  Java序列化是指把Java对象转换为 ...

  7. Hibernate相关概念及序列化和持久化的区别

    hibernate是一种ORM(object relation mapping,对象关系映射)框架,所谓的对象关系映射,通俗的说,就是把JAVA对象保存到关系型数据库中. hibernate要做的事, ...

  8. JSON实现序列化dump和dumps方法,JSON实现反序列化loads和load方法

    通过文件操作,我们可以将字符串写入到一个本地文件.但是,如果是一个对象(例如列表.字典.元组等),就无 法直接写入到一个文件里,需要对这个对象进行序列化,然后才能写入到文件里. 设计一套协议,按照某种 ...

  9. python pickle模块的使用/将python数据对象序列化保存到文件中

    # Python 使用pickle/cPickle模块进行数据的序列化 """Python序列化的概念很简单.内存里面有一个数据结构, 你希望将它保存下来,重用,或者发送 ...

随机推荐

  1. 【POI2017||bzoj4726】Sabota?

    上学期putsnan过了一次,这学期认真写了一遍…… #include<bits/stdc++.h> #define N 500010 using namespace std; ]; ,n ...

  2. mysql 单列索引限制

    innodb_large_prefix. 这个参数默认值是OFF.当改为ON时,允许列索引最大达到3072. >=5.7.7默认打开 <=5.7.6默认关闭 innodb_large_pr ...

  3. 复选框回显、全选、非全选、cookie处理数据、json数组对象转换处理学习笔记参考的页面

    <%@include file="/common/head.jsp"%> <%@ page contentType="text/html; charse ...

  4. Opencv第三章

    2. 下面这个练习是帮助掌握矩阵类型.创造一个三通道二维矩阵,字节类型,大小为100×100,并设置所有数值为0. a. 在矩阵中使用void cvCircle(CvArr* img, CvPoint ...

  5. 如何理解reliability

    首先推荐看: https://wenku.baidu.com/view/f55f400c52ea551810a68746.html 复习一下均值方差 然后重点看: https://www.social ...

  6. (四)监控cpu

    定义规则:创建模板--->群组--->应用集--->监控项--->图形--->触发器--->添加主机(加入到群组,关联模板) 1)cpu空闲率,用户态使用率,内核态 ...

  7. (3)java运行

    java文件后后缀名为 .java 一个java文件的运行需要分为两个阶段,编译阶段和运行阶段 编译阶段 检查java源代码的语法是否错误 生成对应平台的.class文件 例如 :有个A.java的文 ...

  8. Java学习之路(书籍推荐)

    一.基础类 1.<Thinking in java>(阅读2遍),入门第一位是建立正确的概念 2.<Core Java>这本书更贴近实践,更多API的介绍,同样,更新也更频繁. ...

  9. 集训考试题(CF510C Fox And Names的简化版)

    题目描述给定n个由小写字母组成的字符串,请你求出一个字母表顺序,使得这n个字符串是按照字典序升序排列的,数据保证存在合法的字母表顺序.如果存在多个解,输出字典序最小的那个. 输入格式第一行一个整数n. ...

  10. Manacher【p1210】回文检测

    题目描述--->P1210 回文检测 分析: 看到回文显然想到了manacher算法(线性求解回文串问题 如果不了解还是去敲一下板子,学习一下比较好.-->manacher 题目要求我们求 ...