1. 程式人生 > >Caffe程式碼導讀(2):LMDB簡介

Caffe程式碼導讀(2):LMDB簡介

閃電般的記憶體對映型資料庫管理(LMDB)

簡介

LMDB是基於二叉樹的資料庫管理庫,建模基於伯克利資料庫的應用程式介面,但做了大幅精簡。整個資料庫都是記憶體對映型的,所有資料獲取返回資料都是直接從對映的記憶體中返回,所以獲取資料時沒有malloc或memcpy發生。因此該資料庫仍是非常簡單的,因為它不需要自己的頁面快取層,並且非常高效、省記憶體。它在語義上完全符合ACID(原子性、一致性、隔離性、永續性)。當記憶體對映為只讀時,資料庫完整性不會被應用程式的迷失指標寫破壞。

該庫也是執行緒可見的,支援來自多程序/執行緒的併發讀/寫訪問。資料頁使用寫時複製策略,故沒有活動資料頁被覆蓋寫入。這也提供了保護機制,經歷系統崩潰後不需要特殊恢復過程。寫入過程為完全序列的;一次只有一個寫會話是活動的,這保證了寫入者不可能死鎖。資料庫結構是多個版本,所以讀出者執行時不加鎖。寫入這不會阻塞讀出者,讀出者也不會阻塞寫入者。

不像其他熟知的資料庫機制(使用寫前會話日誌或資料僅追加寫),LMDB操作時不需要保持會話。前面兩種都需要週期性地檢查或者壓縮他們的日誌或資料庫檔案,否則會無限增長。LMDB記錄資料庫內的空頁面,在新的寫入操作時重用他們,所以正常使用時資料庫尺寸不會無限增加。

記憶體對映可以用作只讀對映或讀寫對映。預設為只讀對映,這提供了對破壞完全的免疫力。使用讀寫模式提供了更高的寫效能,但增加了被惡意寫入破壞資料庫的可能性。當然如果你的應用程式碼是已知無bug的,那麼這不是個嚴重的問題。