2015-04-01 61 views
1

我測試了ZODB通過創建一個巨大的對象,提交,然後它給了一個警告。 接下來,我開始從根目錄中刪除對象,提交。 .fs文件在空間上仍然是1GB。然後我殺死了REPL。我重新打開python,建立了連接,但現在我似乎無法擺脫這個1 GB文件(除了試圖從磁盤本身刪除它)。ZODB不釋放硬盤空間

代碼是這樣的:

storage = FileStorage('Data.fs') 
db = DB(storage) 
connection = db.open() 
root = connection.root() 

通過創建一些巨大的物體其次,起初我確實是

root['bigObj'] = 'small_str', 
transaction.commit() 

,試圖覆蓋。之後我剛剛刪除了鍵/值。

我缺少什麼部分?

回答

2

ZODB是追加數據庫。 ZODB不會回收或覆蓋舊信息,除非明確告知。這意味着如果需要,您可以創建數據庫的無限撤消歷史記錄。

要回收您需要的磁盤空間pack ZODB database

其他數據庫(MySQL,PostgreSQL)具有相似的特徵。例如,PostgreSQL必須不時更新。

+0

順便說一句,我保持一個列表,我分享的線程。這對ZODB來說非常簡單,但是這個列表變化很大。考慮到這種只能追加的情況,你是否可以提供一些建議(可能這不是一個好主意)? – PascalVKooten 2015-04-01 21:49:06

+0

ZODB不應該成爲大多數用例的問題 - 如果您正在使用本機ZODB列表,那麼它應該在每次更新時只寫入數據庫的增量(儘管我需要確認這一點)。請參閱http://zodborg.readthedocs.org/en/latest/documentation/guide/modules.html#persistent-list-persistentlist - 使用PersistentList而不是[]。這就是ZODB的工作原理 - 你無法改變野獸的本質。如果你需要處理大的,可變的blob,我建議你考慮替代數據庫。這裏有一種在PostgreSQL上類似ZODB行爲的方法https://github.com/Shoobx/pjpersist – 2015-04-01 22:33:44

+0

@PascalvKooten:有一些ZODB後端可以配置爲丟棄歷史版本; 'RelStorage'可以做到這一點。然而,默認的'FileStorage'後端不能。 – 2015-04-02 09:30:28