7

大量のデータ(使用可能なRAMよりも多い)を常にシーケンシャルに読み書きするC++アプリケーションを作成する必要があります。

データを将来の証拠として保持し、文書化するのを容易にするために、私はProtocolBufferを使用します。ただし、プロトコルバッファは大量のデータを処理しません。

以前のソリューションは、データユニットごとに1つのファイルを作成する(そしてそれらをすべて1つのディレクトリに保存する)ことでしたが、これは特にスケーラブルではないようです。

今回は組み込みデータベースを使ってみたいと思います。同様の機能を使用するには、キー->値の関連付けを保存するだけで済みます(したがって、sqliteはやり過ぎのようです)。値は、ProtocolBufferから出力されるバイナリシリアル化になります。

データベースが「メモリに保持するもの、ディスクaspに移動するもの」の問題、「大量のデータをディスクに効率的に保存する方法」の問題を管理し、理想的には、シーケンシャル読み取りパターンを最適化することを期待しています(読み取りによって事前に次のエントリ)。

代替案を探している私は代替案がないことに驚いた。この分離は必要ないため、データベースを別のプロセスに保持したくありません(これによりredisが除外されます)。

私が見つけた唯一のオプションはBerkeleyDBでしたが、不快な低レベルのCapiがあります。次に、私が見つけた最良のオプションは、BerkeleyDBの上にあるstldb4でした。APIは非常に優れているようで、私のニーズに合っています。

でも心配です。stldb4は奇妙に見え(libferrisのものに依存している)、保守されていない解決策(1年前の最後のリリース)であり、私がかなり一般的であると思われる問題についてです。

この問題を管理する方法について、より良い提案がありますか?

回答ありがとうございます。

4

3 に答える 3

5

私は自分の問題に対する答えを見つけたと思います。

Berkeley DBが C++ 用に2 つのAPI を提供していることに気付きませんでした。

  • API のようなバニラ C
  • STL API

この STL API は、データベースに直接アクセスできる STL 互換のベクトルとマップの抽象化を提供します。このようにすることvalue = data_container[key]が可能になります。

これは私にとって最良の解決策のようです。プロトコル バッファと一緒に Berkeley DB STL API を直接使用します。

于 2010-07-23T16:02:15.330 に答える
2

京都内閣をお勧めします。

于 2010-11-29T15:46:52.887 に答える
1

BerkleyDBはあなたのニーズに合っているようです。確かに、その API は少しぎこちないですが、良い API を取得するのであれば、SQLiteの方が優れたソリューションになる可能性がありますが、パフォーマンスはそれほど良くないと思います。

于 2010-07-23T13:58:57.717 に答える