web-dev-qa-db-ja.com

C ++またはCでのディスクベースのB +ツリー実装を探しています

ツリーを保存するためにディスクファイルを使用する、軽量のオープンソースページングB +ツリーの実装を探しています。

これまでのところ、QT(?!)に依存し、コンパイルすらしない メモリベースの実装 または 何か のみを見つけました。

最新のC++が推奨されますが、Cも同様です。

私は完全な埋め込み可能なDBMSソリューションを避けることを好みます。理由は次のとおりです。1)必要に応じて、可能な限り単純なディスクファイル編成を使用できるベアボーンインデックスで十分であり、同時実行性、原子性などすべてが必要ありません。 2)これを使用して独自のインデックスのプロトタイプを作成していますが、アルゴリズムとストレージレイアウトの一部が変更される可能性があります。最小限の労力でやりたいです。プロダクションコードにはなりません。

26

http://people.csail.mit.edu/jaffer/WB

また、オープンソースの埋め込みデータベースからBツリーの実装を再利用することを考えてください。 ( [〜#〜] BDB [〜#〜]SQLiteの など)

9
Vijay Mathew

私自身の実装は http://www.die-schoens.de/prg ライセンスはApacheです。そのディスクベースは、ロック(マルチユーザーなど)も実行できる共有メモリにマップされ、ファイル形式はクラッシュなどから保護します。上記のすべてを簡単にオフに切り替えることができます(必要に応じてコンパイルまたはランタイム)。したがって、ベアボーンはほぼANSI-Cであり、基本的には自分のメモリにキャッシュされ、まったくロックされません。テストプログラムが含まれています。現在、固定サイズのフィールドのみを扱っていますが、私はそれに取り組んでいます...

3
Joerg Schoen

FaircomのC-TreePlusは、20年以上にわたって市販されています。彼らのために働かないでください... FairCom

オラクルが購入した Berkley DB もありますが、それでも彼らのサイトからは無料です。

3
AnthonyLambert

BerkeleyDBの2番目の提案です。 Oracleに購入される前に使用しました。これは完全なリレーショナルデータベースではなく、キーと値のペアを格納するだけです。独自のページングBツリー実装を作成した後、これに切り替えました。これは良い学習体験でしたが、BDBの(不十分な)実装バージョンになるまで機能を追加し続けました。

あなたが自分でそれをしたいのであれば、ここに私たちがしたことの概要があります。 mmapを使用してページをメモリにマッピングしました。各ページの構造はインデックスベースであったため、ページの開始アドレスを使用して、ページ上の任意の要素にアクセスできました。次に、必要に応じてページをマッピングおよびマッピング解除しました。 1 GBのメインメモリが多く考慮されていた頃は、マルチGBのテキストファイルにインデックスを付けていました。

2
KeithB

Berkeley DBを見ると、Oracleでサポートされていますが、オープンソースであり、 ここ で見つけることができます。

1
Jackson

それはあなたが探している解決策ではないと確信していますが、ツリーを自分でファイルに保存してみませんか?必要なのは、シリアル化とif/ofstreamのアプローチだけです。

基本的には、次のようにシリアル化できます。ルートに移動し、ファイルに「0」を「|」のような除算器、ルート内の要素数、次にすべてのルート要素を書き込みます。レベル1の場合は、「1」で繰り返します。レベルを変更しない限り、レベルインデックスを維持すると、空の葉は2 | 0のようになります。

1
DaClown

ソフトウェア会社のRogueWaveは、Tools ++製品の一部としてBTreeOnDiskの優れた実装を行っています。私は90年代後半からそれを使用しています。それの良いところは、1つのファイルに複数のツリーを含めることができることです。ただし、商用ライセンスは必要です。

彼らのコードでは、彼らは「Ammeraal」と呼ばれる男による本への参照を行っています( http://home.planet.nl/~ammeraal/algds.html 、Ammeraal、L。(1996を参照) )C++のアルゴリズムとデータ構造)。彼はディスク上にBTreeを実装しているようで、ソースコードはオンラインでアクセスできるようです。私はそれを使ったことがありません。

私は現在、ソースコードを配布したいプロジェクトに取り組んでいるので、RogueWaveクラスのオープンソースの代替品を見つける必要があります。残念ながら、私はGPLタイプのライセンスに依存したくありません。そうでなければ、解決策は単に「libdb」または同等のものを使用することです。 BSDタイプのライセンスが必要ですが、長い間、適切なものを見つけることができませんでした。しかし、私は以前の投稿のいくつかのリンクを見ていきます。

1
Peter Ritter