10

Bツリーにデータをファイルとして保存する1つの方法は、各構造体がノードを表す構造体のシーケンス(配列)を持つバイナリファイルを使用して、Cで効率的に実行できるようです。したがって、配列を使用してリンクされたリストを作成するのと同様のアプローチで個々のノードを接続できます。しかし、巨大なファイルの途中の数バイトだけを消去することは不可能であるため、問題はノードの削除です。

削除の 1 つの方法は、しきい値のカットオフに達するまで「空の」ノードを追跡し、空のノードを破棄する別のファイルを作成することです。しかし、これは面倒です。

ファイル内の B ツリーを削除したり、表現したりするための単純さ/効率の観点から、より良いアプローチはありますか?

TIA、-Sviiya

4

3 に答える 3

5

B-Tree をファイルに実装するには、ポインターの代わりにファイル オフセットを使用できます。また、ファイル内の削除済みアイテムを再利用できるように、「ファイル メモリ マネージャー」を実装することもできます。

B ツリー ファイルで削除されたブロックを完全に復元するには、新しいファイルで B ツリーを再作成する必要があります。また、ほとんどの OS にはファイルを切り捨てる方法がないことも覚えておいてください。ファイルを切り詰めるための移植可能な方法は、新しいファイルを書き込んで古いファイルを破棄することです。

もう 1 つの提案は、ファイルを B ツリー パーティションとデータ (アイテム) パーティションに分割することです。B-Tree パーティションにはページが含まれます。リーフ ページには、データ項目へのオフセットが含まれます。データ パーティションは、データ項目を含むファイル内のセクションになります。各パーティションを複数作成することになり、パーティションがインターリーブされる場合があります。

ファイルベースの B-Tree をいじるのに多くの時間を費やしましたが、あきらめてデータベース プログラム (またはサーバー) にデータを処理させることにしました。

于 2010-02-03T00:36:14.707 に答える
3

私は非常に迅速な検索を行い、これを掘り下げました:http: //people.csail.mit.edu/jaffer/WB Cソース:http : //cvs.savannah.gnu.org/viewvc/wb/wb/c/-ディスクベースのBツリースタイルのデータベースを提供しているようです-「delete.c」を見ると、ノードを削除すると、そこからすべてが削除されることを意味しているようです-それが正しい動作である場合は、次のように聞こえます役立つかもしれない何か?

また、-Bツリーはファイルシステムでよく使用されます-いくつかのファイルシステムコードを見てみませんか?

私自身の傾向はファイルシステムの傾向です。固定サイズのBツリーがある場合、参照を削除しようとするのではなく、ノードを「削除」するときはいつでも、コードで何も意味しない値に設定するだけです。次に、クリーンアップスレッドを実行して、誰かがファイルを読み取り用に開いているかどうか、すべてが静かにファイルをブロックして整理しているかどうかを確認します。

于 2010-02-02T19:32:36.050 に答える
1

BerkleyDBも使用できます。Cプログラムでうまく機能し、B+ツリーを実装します。

于 2010-02-02T20:15:32.910 に答える