簡體   English   中英

C / C ++:如何在B樹中的文件中存儲數據

[英]C/C++: How to store data in a file in B tree

在我看來,將數據作為文件存儲在B樹中的一種方法可以使用具有結構序列(數組)的二進制文件來有效地完成,每個結構代表一個節點。 因此,可以使用與使用數組創建鏈接列表類似的方法來連接各個節點。 但后來支持的問題是刪除一個節點,因為在一個巨大的文件中只刪除中間的幾個字節是不可能的。

一種刪除方法可以是跟蹤“空”節點,直到達到閾值截止,然后制作另一個將丟棄空節點的文件。 但這很乏味。

從簡單/效率的角度來看,刪除甚至表示文件中的B樹是否有更好的方法?

TIA,-Sviiya

要在文件中實現B-Tree,可以使用文件偏移而不是指針。 此外,您可以實現“文件內存管理器”,以便您可以在文件中重復使用已刪除的項目。

為了完全恢復B樹文件中的已刪除塊,您必須在新文件中重新創建B樹。 還記得大多數操作系統沒有截斷文件的方法。 截斷文件的可移植方法是寫入新文件並銷毀舊文件。

另一個建議是將文件分區為B-Tree分區和數據(項)分區。 B樹分區將包含頁面。 葉頁面將包含數據項的偏移量。 數據分區將是包含數據項的文件中的一個部分。 您最終可能會創建多個分區,並且分區可能會交錯。

我花了很多時間玩基於文件的B-Tree,直到我放棄並決定讓數據庫程序(或服務器)為我處理數據。

我做了一個非常快速的搜索並挖出了這個: http//people.csail.mit.edu/jaffer/WB C來源: http//cvs.savannah.gnu.org/viewvc/wb/wb/c/ -它似乎提供基於磁盤的B樹樣式數據庫 - 雖然看看“delete.c”它似乎意味着如果你刪除一個節點將從中刪除所有內容 - 如果這是正確的行為,那么它聽起來像什么可能有幫助?

另外 - B樹通常用在文件系統中 - 你能不看一些文件系統代碼?

我自己的傾向是文件系統的傾向 - 如果你有一個固定大小的B樹,每當你“刪除”一個節點而不是試圖刪除引用時,只需將值設置為代碼中沒有任何意義。 然后,運行一個清理線程,檢查是否有人打開文件進行讀取,如果所有人都安靜地阻止文件並整理。

您也可以使用Berkley DB。 它適用於C程序並實現B +樹。

暫無
暫無

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

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