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 条目;它是所有文件中增长最快和最大的。酸洗保存会改变删除它的方式吗?而且,再一次 - 为什么文件在删除它们后仍然保留条目?我很感激 4any 建议(这里的第一篇文章 :))

4

3 回答 3

1

您是否尝试使用db.compact()方法?

根据文档:

紧凑(开始=无,停止=无,标志=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 回答