3

私は、C++ 用のグラフベース (またはキー値) データベース ライブラリの設計の準備段階にいます。これは、多くの人がhttp://neo4j.org/などのプロジェクトに似ていることがわかります。

これは設計の非常に初期の段階であるため、私の要件は単純で洗練されておらず、(認めますが)おそらくまだかなり素朴です。

  • 有向非巡回グラフ
    • 根が少なく葉が多い木のような構造
    • ブランチには他のブランチへの参照が含まれる場合があります
    • しかし、サイクルはありません
    • グラフはキーと値のペアで表されます。ほとんどの場合、キーと値は単純な型 (整数) ですが、一部は文字列などのより複雑な型を参照する場合があります。
  • クエリ
    • 通常、単純なクエリではエッジが返されます。つまり、このルートから始まるエッジは、(キー / 値 / キーと値のタプル) に対応しますか?
    • キーの文字列を使用したクエリ (キー、キー、キー、値)
  • アクセスパターンとパフォーマンス
    • 高速ルックアップを強調する必要があります
    • エッジの追加
    • ただし、グラフからのエッジ/ノードの削除はありません。つまり、グラフは大きくなりますが、縮小することはありません。
    • キャッシュの使用に合わせてメモリ レイアウトを最適化するために、グラフで最適化が実行される場合があります。
    • グラフのサイズは約 1 MB ~ 2 GB で、ほとんどの場合、プライマリ メモリに収まるはずです。

これらの大まかな要件を課題として考えると、主な懸念事項は次のとおりです。

  • メモリ ストレージ: レイアウト、割り当て
    • たとえば、固定サイズのブロックのプールですか?
    • クラスタリングアルゴリズムによるメモリ割り当て?
  • 高速クエリ
  • 動的再編成
    • エッジ/ノードの追加を処理する方法は?
    • 最適化のための更新 (例: メモリ レイアウトの改善)
  • 同時アクセス
    • たとえば、最適化スレッドによるメモリ レイアウトの変更を処理しますか?

私は仕事をするための良い出発点を探しているので、既存の仕事への参照を喜んで受け取ります. 最も重要なのは、私が考えていなくて、何を考えるべきか?

4

2 に答える 2

4

しかし、サイクルはありません

高速エッジインサートが必要な場合、これは厳しい要件です。新しいエッジがサイクルを導入しないことの検証は、最悪の場合 O(v+e) です (v は頂点の数、e はエッジの数)。おそらく、エッジの同時挿入も除外されます。この要件をオプションにすることを検討してください。

もう 1 つのオプションは、2 つの挿入操作を区別することです:CheapInsertExpensiveInsert. 各頂点に「ランク」整数を持たせ、低ランクの頂点から高ランクの頂点へのエッジの安価な挿入のみを許可します。高価な挿入にはこの制約がなく、必要に応じてランクが自動的に書き換えられます。クライアントは、任意の頂点のランクを検査および変更できます (低から高へのルールが破られていない限り)。このようにして、おそらくグラフの特定のプロパティを利用して高価な挿入を回避することにより、独自の挿入戦略を実装できます。

于 2009-09-03T08:25:33.317 に答える
2

参照用に興味のある高速なキー/値データベースは、TinyCDB http://www.corpit.ru/mjt/tinycdb.htmlです。

于 2009-09-03T00:32:24.023 に答える