2009-08-26 45 views
1

我正在使用ZODB來存儲一些存儲在內存中的數據以實現持久性。如果內存中的數據服務每次崩潰,重新啓動將從ZODB加載數據,而不是查詢MySQL數據庫中成千上萬行的數據。Python:ZODB文件大小不斷增加 - 沒有更新?

似乎每次我保存時,說500K的數據到我的數據庫文件,我的.fs文件增長500K,而不是停留在500K。作爲一個例子:

storage  = FileStorage.FileStorage(MY_PATH) 
db   = DB(storage) 
connection = db.open() 
root  = connection.root() 

if not root.has_key('data_db'): 
    root['data_db'] = OOBTree() 
mydictionary = {'some dictionary with 500K of data'} 
root['data_db'] = mydictionary 
root._p_changed = 1 
transaction.commit() 
transaction.abort() 
connection.close() 
db.close() 
storage.close() 

我想不斷用當前值mydictionary覆蓋root ['data_db']中的數據。當我打印len(root ['data_db'])時,它始終從mydictionary中打印出正確數量的項目,但每次運行代碼時(具有相同的確切數據),文件大小都會增加數據大小,在此情況下爲500K。

我在這裏做錯了什麼?

回答

2

當ZODB中的數據發生變化時,它會附加到文件的末尾。舊數據留在那裏。要減少文件大小,您需要手動「打包」數據庫。谷歌想出了this mailing list post

+1

是否還有另一種存儲系統(可能是python原生的),你可能會推薦,因爲我想要做的就是每次覆蓋存儲的數據? Pickly會爲我工作,但是當我擁有一大組數據(字典中的1M +條目)時,交易顯得很慢 – sberry 2009-08-26 15:58:00

+0

像Mark說的那樣,我會考慮sqlite。 – 2009-08-26 19:41:32

1

由於您在評論中詢問了另一個存儲系統,您可能需要查看SQLite。

即使SQLite在追加到數據時的行爲相同,它也會提供vacuum命令來恢復未使用的存儲空間。從Python API中,您可以使用vacuum pragma自動執行此操作,也可以執行the vacuum command

+0

嗯。 SQLite並不總是增加數據庫文件的大小。空的頁面被重用。只是這個文件不會縮小,除非你運行'vacuum'命令。 – tzot 2009-09-16 03:05:23