2012-06-24 35 views
1

我使用ZODB,我想我的'database_1.fs'文件複製到其他'database_2.fs', 所以我打開的'database_1.fs'根字典和我(pickle.dump)它在一個文本文件中。從ZODB醃我的字典,但我得到了一個更小的尺寸?

然後我(pickle.load)它在一個字典變量中,最後我用字典變量更新另一個'database_2.fs'的根字典。

它的工作原理,但我不知道爲什麼'database_1.fs'的大小不等於其他'database_2.fs'的大小。

他們仍然是彼此的副本。

def openstorage(store):    #opens the database 
    data={} 
    data['file']=filestorage 
    data['db']=DB(data['file']) 
    data['conn']=data['db'].open() 
    data['root']=data['conn'].root() 
    return data 

def getroot(dicty): 
    return dicty['root'] 

def closestorage(dicty):    #close the database after Saving 
    transaction.commit() 
    dicty['file'].close() 
    dicty['db'].close() 
    dicty['conn'].close() 
    transaction.get().abort() 

那麼這就是我做什麼: -

import pickle 

loc1='G:\\database_1.fs' 
op1=openstorage(loc1) 
root1=getroot(op1) 

loc2='G:database_2.fs' 
op2=openstorage(loc2) 
root2=getroot(op2) 

>>> len(root1) 
215 
>>> len(root2) 
0 

pickle.dump(root1, open("save.txt", "wb")) 
item=pickle.load(open("save.txt", "rb"))   #now item is a dictionary 

root2.update(item) 

closestorage(op1) 
closestorage(op2) 

#after I open both of the databases 
#I get the same keys in both databases 
#But `database_2.fs` is smaller that `database_2.fs` in size I mean. 

>>> len(root2)==len(root1)==215  #they have the same keys 
True 

注:

(1)有持續的字典和列表原

他們的database_1.fs(2)兩具有相同的長度和相同的索引。

+1

ZODB存儲持久性事務日誌AFAIR。 –

+0

你是說日誌文件佔用一個額外的大小? –

回答

0

谷歌搜索後,我發現,通過ZODB所做的任何data.fs實際存儲有關允許ZODB提供一個物體對象的舊副本的一些信息撤消功能,並可以實現多版本併發控制。 所以爲了解決這樣的行爲,你實際上可以使用pack方法。打包存儲意味着刪除未使用的對象修訂版。

謝謝

+0

如果您認爲我誤解了'ZODB'如何存儲數據庫文件,您隨時都可以發表評論 –

相關問題