2011-07-12 15 views
2

私は金融業界で働いています。データ処理のためにデータベースヒットを展開したいと考えています。それは非常に高価です。だから私たちはオンデマンドキャッシュロジックに行くつもりです。 [ランタイムインサート&ランタイム検索]プロセスメモリに大量のデータをキャッシュする

誰でも1000万以上のレコードに対してキャッシュロジックの実装に取り​​組んでいますか?レコードごとに約160〜200バイトと言われています。

私は以下の欠点に直面しました。

  1. は、キーベースのキャッシュレジストリを実装するためにのSTLのstd ::マップを使用することはできません。 200000レコードの後、挿入と参照が非常に遅いです。
  2. 共有メモリやメモリは、これらのデータは&フラットファイル、アプリケーションデータベースは 価値が可能で、メモリ
  3. 使用sqlite3ののプロセス間で共有されていないため、ファイルは、データをキャッシュする、 のために一種のオーバーヘッドがあるマッピングされました。しかし、それも2〜3百万のレコードの後に​​ゆっくりと検索されます。
  4. プロセスメモリには、独自のカーネルメモリ消費量にある制限があります。私の の仮定は、32ビットマシンで2ギガである。& 64ビットマシンで4ギガバイト。

この問題に遭遇して何らかの手段で解決した場合は、私に何か提案してください。

おかげ

+2

DBインデックスは通常、std :: map(R&Bバイナリツリー)ではなく、BTreesによって実装されます。 BTreesはあなたが話しているスケールにはるかに効果的です。 – littleadv

+0

プロセス間で共有メモリファイルとメモリマップファイルの両方を使用できます。少なくともLinuxで。あなたはどのOSを使用していますか? –

+0

これはキーバリューストアかもっと複雑なものですか? –

答えて

1

あなたのキャッシュは、単純なキーと値のストアである場合は、O(1)参照を持っているのルックアップが、std::unordered_map、(nはログ)をOを有し、std::mapを使用すべきではありません。並べ替えが必要な場合は、std::mapのみを使用してください。

パフォーマンスはあなたの後にあるように聞こえるので、Boost Intrusiveを見てください。 unordered_maplistを簡単に組み合わせて、高効率のLRUを作成することができます。

0

はメモリにすべてを読み、主要なアクセスのためのR & Bツリーを作成します。 1つの最近のプロジェクトで

http://www.mit.edu/~emin/source_code/cpp_trees/index.html

、我々はいくつかの10S Mレコードを持つデータベースを持っていたし、そのような戦略を使用していました。

あなたのデータの重量はあなたのポストから2GBです。オーバーヘッドで、それは倍増すると思います。 64ビットアーキテクチャでも問題ありません。

+1

@Daniel .... std :: mapはRed Blackツリーのみを内部的に使用します。データはすぐには利用できません。キャッシュは時間の経過とともに指数関数的に増加します。午前中は記録がないかもしれませんが、近くでは10ミルの記録があるかもしれません。 – Naveen

+0

何回読んで挿入する必要がありますか?また、ある種のイテレータが必要ですか? –

+0

また、これを考慮してください:挿入時間は重要ではありません。なぜなら、データは外部から来るため、フェッチは遅くなるからです。だから、読書に集中する必要があります。私はstd :: mapはRBツリーを使用していると信じていますが、私たちの実装では数千マイクロ秒で私たちのデータ構造から1000レコードが返ってきました。 –

0

私は最近、私たちの製品(3D医療用ボリュームビューア)のメモリ割り当てを、古いメモリマップファイルを使用するように変更しました。

利点があった。

  • 私が好きな場合は、部分のみをマップする場合、私はあなたの、(私の32ビットアプリが時々64ビットマシン上で複数の4ギグを必要とする)
  • すべての物理RAMを割り当てることができますアドレス空間は、アプリケーションが使用するためにほとんど自由です。これにより、信頼性が向上します。
  • メモリ不足の場合は、動作が遅くなり、クラッシュしません。

私の場合、それはちょうどデータ(ほとんど読み取り専用)でした。より複雑なデータ構造を持つ場合、これは「通常の」オブジェクトを使用するよりも多くの作業になります。

これらのプロセス間で実際に共有することができます(実際のファイルがある場合)。これは違った振る舞いをするかもしれませんが、私はその経験がありません。

関連する問題