1

我使用 ZODB,我想将我的'database_1.fs'文件复制到另一个'database_2.fs',所以我打开了它的根字典,'database_1.fs'然后我 ( pickle.dump) 将它放在一个文本文件中。

然后我pickle.load将它( )放在一个字典变量中,最后我用字典变量更新另一个的根字典'database_2.fs'

它有效,但我想知道为什么 the 的大小'database_1.fs'不等于 other 的大小'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) 两者具有相同的长度和相同的索引。

4

1 回答 1

0

谷歌搜索后,我发现 any data.fsmade byZODB实际上存储了一些关于您的旧对象副本的信息,从而允许 ZODB 提供对象撤消功能以及多版本并发控制。所以为了解决这种行为,您实际上可以使用该pack方法。打包存储意味着删除未使用的对象修订。

不管怎么说,还是要谢谢你

于 2012-06-30T03:13:30.507 回答