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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM