私はIPCの初心者です。Writer プロセスは共有メモリにデータを書き込み、多くの Reader プロセスがデータを読み取ります。書き込まれるデータには一意の識別子があり、アクセスを高速化するために一意のキーでインデックスを作成する必要があります (ルックアップ用の STL::map または hashmap など)。また、データは可変長レコード ( XML ) です (平均長は 200 ~ 250 バイト)。OS は Intel Xeon Quad Core Server 上の solaris 10 (i86pc) です。
合計データサイズは 200G 以上です。ただし、共有メモリには最新のデータのみを保持します。履歴データはファイルにあります。共有メモリのサイズは約 4G~6G です。
Boost::interprocess のような利用可能な外部ライブラリはありません
いくつか質問があります。
- どちらがより効率的ですか:shared_memoryまたはmmap(メモリマップファイル)
- 可変長レコードのインデックスを作成する方法。[わかりません。ハッシングがあるのでしょうか?].
- XML が固定サイズの構造に変換された場合、これはうまくいくでしょうか (トレードオフ - 構造のサイズは巨大になり、300 以上のフィールドが可能になります)。
- カスタム アロケータを提供することで、任意の STL を shared_memory に配置できますか?
- セマフォなしで実装することは可能ですか ( CAS を使用したロックレス実装)。
ありがとう
これはどう。
|--------------------------|
| start_id | end_id | -> range of msg id present in the segment
|--------------------------|
| id1 | start_mem | length | ->
|--------------------------| ->
| id2 | start_mem | length | -> table of index for the actual data
|--------------------------| ->
| id3 | start_mem | length | ->
|--------------------------| ->
| id4 | start_mem | length | ->
|--------------------------| ->
| |
| |
| |
| data segment |
| varibale length |
| xml are stored |
| |
| |
|--------------------------|
新しいデータが到着し、セグメントがいっぱいになったとき。最も古いデータが循環的に消去されます。複数のレコードを消去する必要がある可能性があります。