2009-08-26 10 views
1

私は、永続性のためにメモリ内に存在するいくつかのデータを格納するZODBを使用しています。メモリ内のデータを持つサービスがクラッシュした場合、再起動すると、MySQLデータベース内の何千もの行を照会するのではなく、ZODBからデータがロードされます。Python:ZODBファイルサイズが大きくなっています - 更新していませんか?

データベースファイルに500Kのデータを保存するたびに、私の.fsファイルは500Kにとどまるのではなく、500Kずつ増加するようです。例として:

storage  = FileStorage.FileStorage(MY_PATH) 
db   = DB(storage) 
connection = db.open() 
root  = connection.root() 

if not root.has_key('data_db'): 
    root['data_db'] = OOBTree() 
mydictionary = {'some dictionary with 500K of data'} 
root['data_db'] = mydictionary 
root._p_changed = 1 
transaction.commit() 
transaction.abort() 
connection.close() 
db.close() 
storage.close() 

root ['data_db']のデータをmydictionaryの現在の値で上書きし続けたいとします。私は(ルート[「data_dbを」])lenを印刷するときは、常にmydictionaryからのアイテムの正しい数を出力しますが、すべての時間は(正確に同じデータを持つ)。このコードの実行ファイルのサイズは、この場合の500Kには、データサイズによって増加しました。

ここで何か問題がありますか? ZODBのデータに変更が、それはファイルの末尾に追加されます

答えて

2

。古いデータはそこに残されています。ファイルサイズを小さくするには、データベースを手動で「パックする」必要があります。

Googleがthis mailing list postと出てきました。

+1

あなたは私がするたびに保存されたデータを上書きされてやりたいすべてのため、お勧めかもしれません(のpythonにおそらくネイティブ)他のストレージシステムはありますか?マークが言ったように私はsqliteのを検討する、 – sberry

+0

をPicklyは私のために働くだろうが、私は(辞書の中1M +エントリー)データの巨大なセットを持っているとき、トランザクションが遅いようです。 –

1

コメント内に別のストレージシステムについて質問したので、SQLiteを調べるとよいでしょう。

SQLiteは、最初にデータを追加する際に同じように動作しますが、使用されていないストレージスペースを回復するvacuumコマンドを提供します。 Python APIからは、自動的にそれを行うにはvacuum pragmaを使用することができますいずれか、またはあなただけのthe vacuum commandを実行することができます。

+0

Um。 SQLiteは常にデータベースファイルのサイズを増やすわけではありません。空のページは再利用されます。 'vacuum'コマンドを実行しない限り、ファイルは縮小されません。 – tzot

関連する問題