據ZODB documentation:ZODB:要將transaction.savepoint寫入數據的位置?
保存點允許數據管理器保存工作,它的存儲沒有提交完整的交易「,「保存點也對,否則將被用來保持整個國家的可用內存有用。交易。
按照很有啓發性的文章When to commit data in ZODB(馬亭皮特斯):
...整個交易在那裏,你可以要求數據能夠暫時存儲在磁盤中的一個點。 [...]
保存點所做的一件事就是調用ZODB緩存的垃圾回收,這意味着任何當前未使用的數據都會從內存中移除。
的事情是,我需要很多的項目存儲在一個事務中,這樣的事情:
for i, item in enumerate(aLotOfItems):
database[i]=item
if i % 10000 ==0:
transaction.savepoint(True)
transaction.commit()
我kindof預計transaction.savepoint以相同的方式工作爲bsddb3.db.Db.sync
。當調用Db.sync()
時,數據庫將被刷新,您可以觀察它。但是,當設置保存點時,顯然數據庫和tmp文件都不會增長或變化,直到transaction.commit()
。
我真的很困惑:
時的保存點被設置什麼是實際發生的?
它與提交/刷新數據庫有什麼不同?
如果「要臨時存儲在磁盤上的數據」,保存點寫入數據的位置在哪裏?
我可以依靠保存點來逐字「釋放內存」嗎?
謝謝你的巨大幫助。我是否可以通過這種方式理解它:保存點的工作就像---如果已知的現有記錄已更改,它將保留在緩存中,除非我樂觀地認爲永不回滾;如果這條記錄沒有改變,它會從緩存中清除?當我調用cacheMinimize()時,它是否做同樣的事情?如果我想在文件創建時使用rcord而不是內存,我不妨使用ZODB以外的東西,對吧? – DingZh
'cacheMinimize()'做一次掃描,'cacheGC()'做多次掃描;後者是保存點時使用的。直到您提交事務後,ZODB FileStorage纔會更改。 –