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

來源:互聯網
上載者:User

標籤:訪問   developer   選擇   c語言   sdn   hal   事務   復原   入門   

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來完成Object Storage Service轉換過程。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對象序列化或持久化的方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.