python bsddb 删除条目时不刷新

1 投票
3 回答
521 浏览
提问于 2025-04-17 00:53

我有一个用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的方式会改变删除它的方式吗?还有,为什么在删除条目后,文件里仍然保留这些条目?我会很感激任何建议(这是我第一次发帖 :))

3 个回答

0

你应该按照描述来压缩你的数据库,具体可以参考这个链接:http://www.jcea.es/programacion/pybsddb_doc/db.html#db-methods

0

从一个btree数据库中,可能没有办法直接回收空间。最好的办法就是把所有数据导出到一个文本文件里,然后再用这个文件创建一个新的数据库。

1

你试过用 db.compact() 这个方法吗?

根据说明书:

compact(start=None, stop=None, flags=0, compact_fillpercent=0, compact_pages=0, compact_timeout=0)

这个方法可以压缩 Btree 和 Recno 访问方式的数据库,并且可以选择性地把未使用的 Btree、Hash 或 Recno 数据库页面返回给底层的文件系统。

这个方法会返回返回给文件系统的页面数量。

听起来这个方法应该能减少数据库在磁盘上占用的空间。

撰写回答