根据ZODB 文档:
保存点允许数据管理器在不提交完整事务的情况下将工作保存到其存储中。” “保存点对于释放内存也很有用,否则这些内存将用于保持事务的整个状态。
根据非常有指导意义的文章When to commit data in ZODB (Martijn Pieters):
...在整个交易过程中,您可以要求将数据临时存储在磁盘上。[...]
保存点所做的一件事是调用 ZODB 缓存的垃圾收集,这意味着当前未使用的任何数据都将从内存中删除。
问题是,我需要在一个事务中存储很多项目,如下所示:
for i, item in enumerate(aLotOfItems):
database[i]=item
if i % 10000 ==0:
transaction.savepoint(True)
transaction.commit()
我有点期望 transaction.savepoint 以与 .savepoint 相同的方式工作bsddb3.db.Db.sync
。当Db.sync()
被调用时,数据库被刷新,你可以观察它。但是,当设置保存点时,显然数据库和 tmp 文件都不会增长或更改大小 untill transaction.commit()
。
我真的很困惑:
设置保存点时实际发生了什么?
它与提交/刷新数据库有什么不同?
如果“数据要临时存储在磁盘上”,保存点将数据写入到哪里?
我可以指望保存点来真正“释放内存”吗?