python对象序列化或持久化的方法
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学生信息管理系统(JAVA+MYSQL)
- 下一篇: python爬虫淘宝评论_Python爬