1

私は 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) 両方とも同じ長さと同じインデックスを持っています。

4

1 に答える 1

0

グーグルで調べたところ、オブジェクトの古いコピーに関する情報が実際に保存されていることがわかりました。これdata.fsによりZODB、ZODB はオブジェクトの取り消し機能と複数バージョンの同時実行制御を提供できるようになります。そのような動作を解決するために、実際にpackメソッドを使用できます。ストレージをパックすると、未使用のオブジェクト リビジョンが削除されます。

とにかくありがとう

于 2012-06-30T03:13:30.507 に答える