7

このアプリケーションではstd::map、(キー、値)データを格納し、シリアル化を使用してそのデータをディスクに格納するために使用します。このアプローチでは、ディスクI / Oがパフォーマンスのボトルネックであり、キーを使用した値の検索はそれほど高速ではないことがわかりました。

私はLevelDBに出くわし、それを使用することを考えています。しかし、いくつか質問があります。

  1. LevelDBのドキュメントには、(文字列、文字列)キーと値のペア用に作成されたと記載されています。カスタムキーと値のペアに使用できないということですか?
  2. とLevelDBの違いstd::mapは、LevelDBが永続的でありstd::map、メモリ内で機能することです。つまり、ディスクI/OのボトルネックがlevelDBにとってより問題になるということですか。

より具体的には、LevelDBがより良い選択であるかどうかを誰かが説明できますstd::mapか?

PS:hash_mapsを使ってみましたが、遅いようですstd::map

4

2 に答える 2

9

LevelDBは、std::map以外のことを実行します。

std :: mapに(高性能の)永続性が必要だと本当に言っていますか?

  • カスタムアロケータを使用してstd::mapを確認します。メモリマップド領域からエントリを割り当て、fsyncを使用して、戦略的な時点で情報がディスクにヒットするようにします。

  • おそらくそれをEASTL(より高速なstd :: mapを誇り、カスタムアロケータで繁栄します-実際にはデフォルトのアロケータがありません)と組み合わせることができます

  • hash_map(std :: unorderded_map)の調整を見てください。hash_mapsの速度が遅い場合は、(a)loadfactor(b)ハッシュ関数の調整を調べる必要があります

  • 最後になりましたが、マップのバイナリシリアル化(選択した実装に関係なく)のためのBoostSerializationの使用を評価してください。私の経験では、BoostSerializationのパフォーマンスは最高です。

于 2011-10-18T10:12:03.800 に答える
2

あなたが今していることはこれです:

ファイルに1000000レコードがあるとします。ファイル全体をstd::mapに読み込みます。これには、約1000000回の操作が必要です。検索/挿入を使用して要素を検索および/または挿入します。これには対数時間がかかります(約20回の比較)。そして、ファイル全体を再度保存して、これらすべての1000000レコードをファイルに戻します。

問題は、std::mapを使用してもまったくメリットがないことです。std :: mapを使用すると、検索時間が短縮されます(対数)が、ルックアップごとにマップ全体を初期化およびシリアル化すると、その利点が無効になります。

必要なのは、プログラムを再設計して、起動時にマップを1回ロードし、終了時に1回シリアル化することです。または、データベースのセマンティクスが必要な場合は、実際のデータベースの実装に進んでください。SQLiteを使用することをお勧めしますが、LevelDBも同様に適している場合があります。

于 2011-10-18T10:16:19.927 に答える