python bsddb 删除条目时不刷新
我有一个用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 数据库页面返回给底层的文件系统。
这个方法会返回返回给文件系统的页面数量。
听起来这个方法应该能减少数据库在磁盘上占用的空间。