1

Python BSDDB データベースを取得しました。もちろんハードディスクに保存されています。いくつかのエントリを削除しても、ドライブ上のファイルは小さくなりません (その結果、非常に速く大きくなります...)

utDelList   = []
urlsDelList = []
for ut in iter(self.urls2task):

    tmp = string.split(ut, ":")
    uid = tmp[1]
    url = cPickle.loads(self.urls[int(uid)])
    urlsDelList.append(uid)             
    utDelList.append(ut)                
    del self.urlsDepth[uid]
    del self.urlsStatus[uid]
    del url

for ut in utDelList:
    del self.urls2task[ut]

for uid in urlsDelList:
    del self.urls[int(uid)]

(...)
#synchronize all files
self.sync() 

私の最後の希望は、ファイルを閉じて再度開くことにより、野蛮な方法でフラッシュを強制することでした

#close all files & start them again, eg
self.tasks.close()
self.urls2task.close()
self.tasks = bsddb.rnopen(filepath)
self.urls2task = bsddb.hashopen

ここで重要な要素は self.tasks エントリです。すべてのファイルの中で最も速く大きくなります。pickling-save はそれを削除する方法を変更しますか? また、ファイルを削除した後もエントリが保持されるのはなぜですか? 私は感謝しています4任意の提案(ここに最初の投稿:))

4

3 に答える 3

1

db.compact()メソッドを使用しようとしましたか?

ドキュメントによると:

コンパクト(start = None、stop = None、flags = 0、compact_fillpercent = 0、compact_pages = 0、compact_timeout = 0)

BtreeおよびRecnoアクセスメソッドデータベースを圧縮し、オプションで未使用のBtree、Hash、またはRecnoデータベースページを基になるファイルシステムに返します。

このメソッドは、ファイルシステムに返されたページ数を返します。

ディスク上のデータベースのサイズを減らす必要があるようです

于 2011-08-31T12:10:35.973 に答える
0

おそらく、btreeデータベース自体からスペースを取り戻す方法はありません。最善の方法は、テキストファイル内のすべてのデータをdb_dumpし、そのファイルのdb_loadを使用して新しいデータベースを作成することです。

于 2011-08-31T11:38:46.960 に答える
0

http://www.jcea.es/programacion/pybsddb_doc/db.html#db-methodsに記載されているように、ベースを圧縮する必要があります

于 2011-08-31T12:19:51.923 に答える