2013-08-19 81 views
9

我在處理數十億個需要映射/排隊的對象的項目中使用MapDB。程序結束後,我不需要任何類型的持久性(MapDB數據庫都是臨時的)。我希望程序儘可能快地運行,但我對MapDB的commit()函數(我認爲它與性能有關)感到困惑,即使在閱讀docs之後。我的問題:高效使用MapDB(困惑於提交)

  1. 提交到底是做什麼的?我的工作理解是它將堆中的對象序列化到磁盤,從而釋放堆空間。這是否準確?

  2. 對剛剛提交的對象的引用會發生什麼?他們得到的GC清理,或做他們莫名其妙地「參考」在磁盤上的對象(創建mapdb使這個透明?)

最後,我想知道如何儘可能有效地我可以使用創建mapdb,但如果不知道commit()是什麼,我無法做到這一點。我將非常感謝您有效使用MapDB的任何其他建議。

回答

2

commit操作是transactions上的操作,就像您在數據庫系統中發現的一樣。 MapDB實現事務處理,因此commit實際上是「使我對這個數據庫所做的更改永久化並對其他用戶可見」。免費的操作是rollback,它會丟棄您在當前交易中所做的所有更改。提交不會(直接)影響內存中的內容,不會影響內存中的內容。如果您嘗試回收堆空間,則可能需要查看compact()

對於第二個問題,如果你持有一個對象的強引用,那麼你繼續保持這個強引用。 MapDB不會爲你刪除它。在大多數情況下,您應該將MapDB視爲普通的Java地圖。當你打電話給get時,MapDB會隱藏它是在你的內存還是在磁盤上,只是給你返回一個對檢索到的對象的可用引用。那個被檢索的對象將在內存中一直存在,直到它變成垃圾,就像其他東西一樣。