質問

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

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

  1. levelDBのドキュメントでは、(文字列、文字列)キー値ペアのために作成されています。カスタムキー値のペアに使用できないということですか?
  2. 間の違いのようです std::map levelDBは、levelDBが永続的であるということです std::map メモリで動作します。そのため、Disk I/O BottleneckがLevelDBの問題が発生することを意味します。

より具体的には誰でもレベルDBがより良い選択になる可能性があるかどうかを説明してください std::map?

PS:使ってみました hash_mapSしかし、それはより遅いようです std::map

役に立ちましたか?

解決

levelDBは、std :: map以外のことを行うだけです。

あなたは本当にあなたがstd ::マップのために(高性能)永続性が欲しいと言っていますか?

  • STD ::カスタムアロケーターをマップしてください。メモリマッピングされた領域からエントリを割り当て、FSYNCを使用して、戦略的な瞬間に情報がディスクに当たるようにします。

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

  • hash_map(std :: unorderded_map)のチューニングを見てください。 hash_mapsが遅い場合は、(a)loadfactor(b)ハッシュ機能チューニングを調べる必要があります

  • 最後になりましたが、マップのバイナリシリアル化にブーストシリアル化の使用を評価します(選択した実装が何であれ)。私の経験では、シリアル化のパフォーマンスが請求書のトップです。

他のヒント

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

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

問題は、STD :: MAPを使用することから絶対に何も利益を得ないことです。 STD :: MAPは高速検索時間(対数)を提供しますが、各ルックアップごとにマップ全体を初期化およびシリアル化すると、利点が無効になります。

必要なのは、プログラムを再設計して、スタートアップで一度マップをロードし、終了時に一度シリアル化することです。または、おそらくデータベースセマンティクスが必要な場合は、実際のデータベースの実装に移動します。 sqliteを使用することをお勧めしますが、leveldbはあなたにとっても同じくらい良いかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top