[英]Implementing an in memory storage with B+ tree index
我正在嘗試在內存數據存儲中存儲塊中的記錄。 請注意,一個塊可能包含多個記錄。 然后使用 b+ 樹索引根據記錄的字段對每個塊地址進行索引。 從 TSV 文件中讀取記錄。
在 C++ 中這樣做的一些建議方法是什么? 我正在考慮有一個用於存儲的內存池,分成多個塊,但我不確定如何保留每個塊地址的索引。
是否推薦使用這種方法,還是我應該堅持使用 new() 和 delete() 每條記錄?
目前,我正在為 B+ 樹創建一個類、一個存儲類和一個 main.cpp,但我不確定每個文件中要包含什么。
剛接觸 C++,但有其他 OOP 語言(Java、Python 和一些 C)的經驗。 任何關於實施的建議都非常感謝。
謝謝!
對於內存存儲,使用絕對地址還是索引(相對於基地址)來標識塊並不重要。 但是,如果您想將 BTree 存儲到文件中,則索引方法將起作用。
首先,圍繞以下界面設計您的項目:
index_to_block
:獲取一個索引,返回一個塊指針。new_block
: 返回新塊的索引free_block
: 釋放一個塊在原型設計期間,您可以簡單地使塊指針與索引相同。 這意味着該接口分別是身份函數new
和delete
。
如果您想稍后切換到連續內存模型,請使用mmap
獲取例如。 TB 大小的內存塊。 不用擔心,在您觸摸它之前,您的操作系統不會使用實際內存支持它。 現在您的index_to_block
將執行類似reinterpret_cast<block*>(BASE_ADDRESS + idx * BLOCK_SIZE)
(如果BASE_ADDRESS
是uint8_t*
)或&BASE_ADDRESS[idx]
(如果BASE_ADDRESS
是一個block*
)之類的操作。 另外兩個函數將操作某種塊空閑列表(或者您可以總是分配新塊)。
最后,我強烈建議閱讀有關SQLite 文件格式的文檔。 它很好地描述了如何實現生產級 B 樹結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.