當前位置:
首頁 > 知識 > Shelve:對象的持久化存儲

Shelve:對象的持久化存儲

Shelve:對象的持久化存儲

目的:Shelve模塊為任意能夠pickle的Python對象實現持久化存儲,並提供一個類似字典的介面。

在關係型資料庫還過於複雜的情境中,Shelve為你提供了Python對象持久化的另一種方案。

創建一個新的Shelf

使用shelf最簡單的方法是使用DbfilenameShelf類,它使用dbm來存儲數據。這個類的實例可以通過shelve.open直接創建:

Shelve:對象的持久化存儲

如果想再次訪問該數據,打開shelf並像字典一樣使用它。

Shelve:對象的持久化存儲

講上面兩段代碼運行一下,得到下面輸出:

Shelve:對象的持久化存儲

dbm模塊不支持多個應用同時寫入同一個資料庫,但是確實支持並發的讀取操作。如果一個客戶端不應該修改shelf,那麼添加參數flag="r",告訴shelf以只讀模式打開。

Shelve:對象的持久化存儲

如果一個只讀模式打開的客戶端,試圖修改shelve的數據,那麼會報錯。異常類型根據dbm底層選用的資料庫的不同會有所不同。

Shelve:對象的持久化存儲

回寫

默認情況下,shelve不會追蹤對象的修改。這意味著,如果從shelve取出的對象的一部分被修改了,那麼你必須明確地重新寫入整個對象,才能將這個修改保存起來。

Shelve:對象的持久化存儲

在這個例子中,key1代表的字典沒有重新寫入,所以當這個shelf重新打開時,key1代表的字典沒有發生變化。

Shelve:對象的持久化存儲

為了讓shelves自動監測並保存對對象的修改,打開時加上writeback參數。有了writeback參數,shelve會在內存中為所有從資料庫中取出的對象做一份緩存,當shelf被關閉時,這些緩存對象也會自動寫回到資料庫中。

Shelve:對象的持久化存儲

雖然這個參數減少了編程出錯的幾率,並且使得回寫過程更加透明,但是也有些情況不宜使用這個參數。shelf打開後,使用到的緩存會消耗額外的內存,並且關閉時,回寫的過程會拖慢程序。所有緩存的對象都會回寫到資料庫,而不是修改的才會回寫,因為shelve並沒有記錄哪些對象修改了。如果你的程序中修改的數據只佔使用數據的一小部分,那麼這個參數可能有點太耗費資源了。

Shelve:對象的持久化存儲

特定Shelf類型

前面的例子中,我們都使用的是shelve的默認參數。打開資料庫我們都使用的是shelve.open,而沒有指定資料庫類型。通常情況下這就夠了,但是也有一些場景,資料庫格式很重要。在這些情況下,直接使用DbfilenameShelf類或者BsdDbShelf類,甚至繼承於Shelf,定製一個自己的類。


英文原文:https://pymotw.com/3/shelve/index.html

譯者:詩書塞外

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

Python3在磁碟上的B+樹:Bplustree

TAG:Python部落 |