我使用ZODB,我想将我的'database_1.fs'
文件复制到另一个'database_2.fs'
,
所以我在文本文件中打开了'database_1.fs'
和我(pickle.dump
)的根词典。
然后我(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)它们的长度和索引相同。
答案 0 :(得分:0)
在谷歌搜索之后,我发现data.fs
所做的任何ZODB
实际上都存储了一些有关旧旧对象副本的信息,从而允许ZODB提供对象撤销功能以及多版本并发控制。
因此,为了解决此类行为,您实际上可以使用pack
方法。
打包存储意味着删除未使用的对象修订。
非常感谢