如何持久化python对象

Python016

如何持久化python对象,第1张

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 允许对象的数目比同时在能内存中所保持的对象要多。

今天的故事从持久化开始,最早知道持久化这个是上历史课上,太祖论断的xxx持久化,从此持久化就是一个高端、大气、上档次的词语。后来转行当程序员,老是听小伙伴说数据持久化,不明觉厉,不过因为懒,也没去搞明白是啥意思!今天刚好想学习pickle的知识,看到了持久化一词,去查了一下,哦,原来如此,妙不可言——果然是假大空!我已经浅薄地理解为把数据存储起来!

之前在 python基础 里面我们有谈到过python文件读写,其实就是一种字符串的持久化方式。那么我们可以把数据想办法装换为字符串,就可以实现数据的持久化。那么有没有更好的方式呢?当然有啦,今天一起学习python特有的数据持久化模块 pickle

pickle的口号是,一切都对象皆可持久化,简单方便直接暴力美啊,大家有什么想存储的对象,赶紧用pickle吧!pickle还有一个小兄弟json,它能对json格式对象进行持久化或者加载,json格式文件在很多语言都是通用的,所以处理json文件时候建议使用json模块。类似numpy里面也定义了save持久化的函数,但是底层其实是使用的pickle方法...