B樹 是怎麼存到硬碟上的?

oceanbase是B+樹。innodb也是B樹。這種數據結構開出來。malloc到內存上,是怎麼在硬碟保持結構的哇? 外存怎麼來操作,那指針啥的呢,可以在硬碟定址么?linux有API么?。非計算機專業弱菜求指點。


演算法是超脫形式的存在。

磁碟,具體是什麼先不管,演算法上,或者說數學上,是否可以認為是可以在位置n上保存數字m的一個裝置?

比如你要在磁碟的第100345個位置上放一個數字31415926,可能需要在一個硬體寄存器上放100345,然後在另一個硬體寄存器上寫31415,還給另一個寄存器放926,然後在第三個寄存器上放上1(寫)這個標記,然後等待10ms,再寫一個0標記,表示開始……

無論如何,最終在演算法模型上,都是disk[100345]=31415926。

這樣,無論形式如何,100345都是指針,這個寫操作永遠都是「定址」和「寫」的過程。


我只說我了解的一個具體實現,即boltdb https://github.com/boltdb/bolt

該實現中,將數據查找的演算法(即b+樹)與數據的存儲(即題主的問題所在)抽象為2個概念:node和page
page對應著操作系統內存頁的最小分配單位(這裡又牽涉到另外一個概念:mmap,作者出於性能等原因的考慮,使用這種方式使數據落地)

具體實現則是,page對node暴露了branch和leaf這2個介面,用於node組織b+樹結構,同時page將branch和leaf對應的數據序列化後寫入到硬碟中
由於node本身為b+樹結構,所以檢索(即數據查找)自然而然是標準的樹查找演算法,查找到相應的leaf節點後,從page中載入數據返回給上層調用


你可以去看(程序員的自我修養)


B樹設計的目的就是為了便於在磁碟上進行查找的:

「B樹中的每個結點根據實際情況可以包含大量的關鍵字信息和分支(當然是不能超過磁碟塊的大小,根據磁碟驅動(diskdrives)的不同,一般塊的大小在1k~4k左右);這樣樹的深度降低了,這就意味著查找一個元素只要很少結點從外存磁碟中讀入內存,很快訪問到要查找的數據。」

「資料庫系統的設計者巧妙利用了磁碟預讀原理,將一個節點的大小設為等於一個頁,這樣每個節點只需要一次I/O就可以完全載入。」

「B-Tree中一次檢索最多需要h-1次I/O(根節點常駐內存),漸進複雜度為O(h)=O(logdN)。一般實際應用中,出度d是非常大的數字,通常超過100,因此h非常小(通常不超過3)。而紅黑樹的h明顯要深的多了,由於邏輯上很近的節點(父子)物理上可能很遠,無法利用局部性,所以紅黑樹的I/O漸進複雜度也為O(h),效率明顯比B-Tree差很多。」

以上內容粘貼自:http://m.blog.csdn.net/article/details?id=26104921


<深入理解計算機系統>,看這個。


推薦閱讀:

如何計算有多個起終點的最小費用流問題?
如何理解benders decomposition在混合整數規劃中的應用?

TAG:演算法 | Linux | 數據結構 | Linux開發 | BB樹 |