2012-06-24 1 views
1

Я использую ZODB, и я хочу скопировать свой файл 'database_1.fs' в другой 'database_2.fs', , поэтому я открыл словарь корня этого 'database_1.fs' и I (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

После того, как я узнал, что любой data.fs, сделанный ZODB, фактически хранит некоторую информацию о ваших старых копиях объектов, позволяя ZODB предлагать функцию отмены объекта, а также контроль параллелизма нескольких версий. SO, чтобы решить такое поведение, вы можете использовать метод pack. Упаковка средства хранения, позволяющая удалить неиспользуемые объекты.

спасибо в любом случае

+0

Вы всегда можете прокомментировать, если думаете, что я неправильно понял, как «ZODB» хранит файлы базы данных –