それは私が持っているものです:
- Windowsサービス
- C#
- マルチスレッド
- サービスはRead-Write-Lockを使用します(一度に複数の読み取り、書き込みは他の読み取り/書き込みスレッドをブロックします)
- シンプルな自作のDB
- C ++
- メモリに収まるほど小さい
- 起動時にロードしたくない十分な大きさ(例:10GB)
- 読み取りパフォーマンスは非常に重要です
- 書くことはそれほど重要ではありません
- 木の構造
- ツリーノードに保持されている情報はファイルに保存されます
- パフォーマンスを向上させるために、ファイルは最初に使用およびキャッシュされたときにのみロードされます
- DBの起動を高速化するための遅延初期化
DBはこれらのノード情報に非常に頻繁に(1秒間に数千回の大きさで)アクセスし、私はあまり頻繁に書き込まないので、ある種のダブルチェックロックパターンを使用したいと思います。
ここでダブルチェックロックパターンについて多くの質問があることは知っていますが、非常に多くの異なる意見があるように思われるので、私の場合に何が最善かわかりません。私のセットアップで何をしますか?
次に例を示します。
- 100万ノードのツリー
- すべてのノードは、キーと値のペアのリストを格納します(永続性のためにファイルに格納され、ファイルサイズの大きさ:10kB)
- 初めてノードにアクセスするとき、リストはマップにロードおよび保存されます(sth。like std :: map)
- 次にこのノードにアクセスするときに、ファイルを再度ロードする必要はありません。マップから取得するだけです。
- 唯一の問題:2つのスレッドが初めてノードに同時にアクセスしていて、キャッシュマップに書き込みたい。これが発生する可能性は非常に低いですが、不可能ではありません。ここでスレッドセーフが必要になりますが、通常は必要ないので(特に、DB全体がメモリに格納されたら)、それほど時間はかかりません。