1

問題:

最大 8 * 1024 * 1024 の ID まで、非常に大きなデータセットを扱っています。

  1. void * 部分が指す構造体の配列を事前に割り当てました。
  2. 「フリー」ポインターはスタックにプッシュされ、使用されるとポップされ、hash_map から削除されるとプッシュされます。(これは 256 MB に近いメモリです)

  3. システム時間/パフォーマンスの大部分が、std::hash_map の追加操作で消費されていることを確認しました。

構造体の順序; std::hash_map OrderDatabase;

私が本当にやりたいことは、MAX_ORDERS をコンストラクターに渡すことです。

std::hash_map OrderDatabase(MAX_ORDERS);

// コンテナを事前に割り当てて、挿入/削除に malloc/free が関与しないようにします。

提案は大歓迎です!補足として、厳密に STL/C++ に固執しようとしています。

編集/更新:

私も次のことを試しました:

hash_map MapTest; hash_map::allocator_type MapAlloc = MapTest.get_allocator();

ペア *ary = MapAlloc.allocate(MAX_ORDERS); // ここでの問題は、ulonglong が const であることです!

アイデアは、それぞれをスタックにプッシュし、割り当てのためにポップし、maptest[id] = ptr; の代わりに挿入を使用することでした。

//更新 2:

  1. stack< pair * > pointer_stack を作成し、事前に割り当てられたポインターをプッシュします。
  2. ポインターをポップします。値を割り当てます。
  3. hash_map に挿入:
  4. 項目を見つけて、アドレスへのポインターを取得します。insert を呼び出したにもかかわらず、hash_map が新しいペアを割り当てたようです。

これにより、削除とスタックへのプッシュが実行できなくなります。

4

1 に答える 1

1

使用する必要がありますmapか? mallocカスタムアロケータで遅さを克服したとしても、mapの実装はツリーの再調整を何度も実行する必要があり、それを変更できるとは思いません。

マップを読み取り専用にする場合 (つまり、使用insertする前にデータを入力するだけの場合)、単純にキー/インデックスのペアの並べ替えられた配列を用意し、バイナリ検索を使用します。検索は と同じくらい速くなりmap、消費されるメモリははるかに少なくなります。operator[]便宜上、いつでも繰り返しでラップできます。

C++11unordered_mapでは、メソッドによる事前割り当てが可能reserve()です。検索/挿入/削除には一定の時間がかかります。ただし、std::map よりも多くのメモリを消費します。

于 2012-09-05T17:33:04.237 に答える