1

永続化のために、メモリに存在するデータを格納するためにZODBを使用しています。メモリ内のデータを含むサービスがクラッシュするたびにクラッシュした場合、再起動すると、MySQLデータベースの数十万行をクエリするのではなく、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の現在の値で継続的に上書きしたい。len(root ['data_db'])を出力すると、常にmydictionaryから正しい数のアイテムが出力されますが、このコードが(同じ正確なデータで)実行されるたびに、ファイルサイズはデータサイズ(この場合は500K)だけ増加します。

私はここで何か間違ったことをしていますか?

4

2 に答える 2

2

ZODBのデータが変更されると、ファイルの最後に追加されます。古いデータが残っています。ファイルサイズを小さくするには、データベースを手動で「パック」する必要があります。

Googleはこのメーリングリストの投稿を思いついた。

于 2009-08-26T15:48:57.503 に答える
1

コメントで別のストレージシステムについて質問したので、SQLiteを調べてみてください。

SQLiteは、最初にデータを追加する際に同じように動作しますが、未使用のストレージスペースを回復するためのバキュームコマンドを提供します。Python APIから、バキュームプラグマを使用して自動的に実行するか、バキュームコマンドを実行することができます。

于 2009-08-26T16:32:54.110 に答える