Caffe代码导读(2):LMDB简介
閃電般的內存映射型數據庫管理(LMDB)
簡介
LMDB是基于二叉樹的數據庫管理庫,建模基于伯克利數據庫的應用程序接口,但做了大幅精簡。整個數據庫都是內存映射型的,所有數據獲取返回數據都是直接從映射的內存中返回,所以獲取數據時沒有malloc或memcpy發生。因此該數據庫仍是非常簡單的,因為它不需要自己的頁面緩存層,并且非常高效、省內存。它在語義上完全符合ACID(原子性、一致性、隔離性、持久性)。當內存映射為只讀時,數據庫完整性不會被應用程序的迷失指針寫破壞。
?
該庫也是線程可見的,支持來自多進程/線程的并發讀/寫訪問。數據頁使用寫時復制策略,故沒有活動數據頁被覆蓋寫入。這也提供了保護機制,經歷系統崩潰后不需要特殊恢復過程。寫入過程為完全串行的;一次只有一個寫會話是活動的,這保證了寫入者不可能死鎖。數據庫結構是多個版本,所以讀出者運行時不加鎖。寫入這不會阻塞讀出者,讀出者也不會阻塞寫入者。
?
不像其他熟知的數據庫機制(使用寫前會話日志或數據僅追加寫),LMDB操作時不需要保持會話。前面兩種都需要周期性地檢查或者壓縮他們的日志或數據庫文件,否則會無限增長。LMDB記錄數據庫內的空頁面,在新的寫入操作時重用他們,所以正常使用時數據庫尺寸不會無限增加。
?
內存映射可以用作只讀映射或讀寫映射。默認為只讀映射,這提供了對破壞完全的免疫力。使用讀寫模式提供了更高的寫性能,但增加了被惡意寫入破壞數據庫的可能性。當然如果你的應用代碼是已知無bug的,那么這不是個嚴重的問題。
總結
以上是生活随笔為你收集整理的Caffe代码导读(2):LMDB简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Caffe代码导读(1):Protobu
- 下一篇: Caffe代码导读(4):数据集准备