日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python对象序列化或持久化的方法

發(fā)布時(shí)間:2023/12/9 python 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python对象序列化或持久化的方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

一、Python對象持久化方法

目前為止,據(jù)我所知,在python中對象持久化有以下幾種方法:

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

2. 使用marshal和pickle來序列化python對象,并具備存儲到介質(zhì)上的功能。兩者的區(qū)別在于:marshal只能處理簡單的Python對象,包括數(shù)字、序列、映射、以及代碼對象;而pickle還可以處理遞歸對象,被不同地方多次引用的對象,以及用戶定義的類和實(shí)例。其中,pickle有一個C語言實(shí)現(xiàn)的版本——cPickle,具有更高的效率,建議使用cPickle。

3. 雖然pickle提供非常強(qiáng)大的功能了,已經(jīng)可以滿足我們大部分的需求了,但是,人類的需求是無止境的,光序列化不行啊,只用 pickle 不能解決命名和查找 pickle 文件這樣的問題,要是可以對序列化的對象提供管理功能,支持并發(fā)訪問就好了。因此,人們發(fā)明了shelve模塊,它是前兩者的綜合。shelve模塊使用anydbm模塊尋找合適的DBM模塊,然后使用cPickle來完成對象存儲轉(zhuǎn)換過程。shelve模塊允許對數(shù)據(jù)庫文件進(jìn)行并發(fā)的讀訪問,但不允許共享讀/寫訪問。

4. 還有一種方案,是在IBM的網(wǎng)站上看到的。那就是ZODB了。ZODB比簡單的 pickle 文件更健壯以及更具有可伸縮性。ZODB是一個針對Python的Z對象數(shù)據(jù)庫,是一個健壯的、多用戶的和面向?qū)ο蟮臄?shù)據(jù)庫系統(tǒng),它能夠存儲和管理任意復(fù)雜的 Python 對象,并支持事務(wù)操作和并發(fā)控制。其實(shí),ZODB也依靠Python 的本機(jī)序列化能力,而且要有效地使用 ZODB,必須充分了解 pickle。

5. 最后一只知道的解決持久性問題的方法是 Prevayler,PyPerSyst 將整個對象系統(tǒng)保存在內(nèi)存中,并通過不時(shí)地將系統(tǒng)快照 pickle 到磁盤以及維護(hù)一個命令日志(通過此日志可以重新應(yīng)用最新的快照)來提供災(zāi)難恢復(fù)。所以,盡管使用 PyPerSyst 的應(yīng)用程序受到可用內(nèi)存的限制,但好處是本機(jī)對象系統(tǒng)可以完全裝入到內(nèi)存中,因而速度極快,而且實(shí)現(xiàn)起來要比如 ZODB 這樣的數(shù)據(jù)庫簡單,ZODB 允許對象的數(shù)目比同時(shí)在能內(nèi)存中所保持的對象要多。

背景知識:它最初是用 Java 實(shí)現(xiàn)的。后來,一群 Python 程序員將 Prevayler 移植到了 Python 上,另起名為 PyPerSyst,由 SourceForge 托管。Prevayler/PyPerSyst 概念也是建立在 Java 和 Python 語言的本機(jī)序列化能力之上。

6. 我今天又發(fā)現(xiàn)了一個模塊Durus,非常好的模塊,支持多線程并發(fā)操作,支持回滾操作。不過安裝的時(shí)候沒裝上,好像是缺少vc里面文件似的,不管了。

二、我該如何選擇

上面5種方案是我在綜合相關(guān)資料匯總的,那么現(xiàn)在輪到如何選擇。我選擇的一個原則:“懶”,怎么講,就是盡量在完成任務(wù)的情況下,降低復(fù)雜度和將來的兼容性。第五種方案對我不太適用,全部load到內(nèi)存基本不可能,所以我先暫時(shí)選第四種方案吧,方便讀取,使用對象數(shù)據(jù)庫對于我的項(xiàng)目應(yīng)該是有好處的。

參考性的意見,我認(rèn)為得看自己定了,如果想簡單,用pickle就能解決問題。我也想用pickle的,可是一大堆對象,還需要檢索方便,當(dāng)然選擇第四種方案。其實(shí)第三種方案也適合我的,如果時(shí)間充裕的話,我還想第四種方案和第三種做一個實(shí)驗(yàn),比較一下,再寫一篇文章給大家參考。

參考資料:

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

總結(jié)

以上是生活随笔為你收集整理的python对象序列化或持久化的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。