簡體   English   中英

使用 B+ 樹索引實現內存存儲

[英]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 : 釋放一個塊

在原型設計期間,您可以簡單地使塊指針與索引相同。 這意味着該接口分別是身份函數newdelete

如果您想稍后切換到連續內存模型,請使用mmap獲取例如。 TB 大小的內存塊。 不用擔心,在您觸摸它之前,您的操作系統不會使用實際內存支持它。 現在您的index_to_block將執行類似reinterpret_cast<block*>(BASE_ADDRESS + idx * BLOCK_SIZE) (如果BASE_ADDRESSuint8_t* )或&BASE_ADDRESS[idx] (如果BASE_ADDRESS是一個block* )之類的操作。 另外兩個函數將操作某種塊空閑列表(或者您可以總是分配新塊)。

最后,我強烈建議閱讀有關SQLite 文件格式的文檔。 它很好地描述了如何實現生產級 B 樹結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM