私は、非常に具体的なユースケース向けにインメモリオブジェクトデータベースを設計しています。単一のライターですが、効率的な同時読み取りをサポートする必要があります。読み取りは分離する必要があります。クエリ言語はありません。データベースは次のもののみをサポートします。
- 属性/属性のセットによってオブジェクト/ -sを取得します(式のサポートがあるかもしれません、例えば
x.count < 5
) - オブジェクトの属性を取得
クエリは、上記の任意の数の操作で構成される必須のスクリプトです。データサイズは<<メモリであるため、ほとんどの属性のすべてのオブジェクトとインデックスは、スワップすることなく快適に収まるはずです。
必要なのは、オブジェクトの属性インデックスのデータ構造です。これは、書き込み時のO(n)であり、書き込みの同時実行性をサポートしませんが、理想的にはO(1)スナップショット(書き込み時のコピー)およびO(logN)アクセスをサポートする必要があります。理想的には、バージョン間で最大限の構造共有を行うことで、読み取りの同時実行性を高めることができます。
私はCTries、コンカレントBST、コンカレントスプレイツリーを見ていましたが、ここで本当に正しい方向を見ているかどうかはわかりません。上記の構造は、私が気にしない挿入の複雑さに多くの注意を払っています。
質問:すぐに使用できるユースケースに適した既知のデータ構造はありますか?
編集:もう少し考えた後、永続的なBST / Splayツリーが機能するようです。ライターは「マスター」コピーを更新し、クエリは実行の開始時にツリーを取得し、完了後に破棄します。しかし、より良い解決策があるかどうかはまだ興味があります。