問題:
最大 8 * 1024 * 1024 の ID まで、非常に大きなデータセットを扱っています。
- void * 部分が指す構造体の配列を事前に割り当てました。
「フリー」ポインターはスタックにプッシュされ、使用されるとポップされ、hash_map から削除されるとプッシュされます。(これは 256 MB に近いメモリです)
システム時間/パフォーマンスの大部分が、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:
- stack< pair * > pointer_stack を作成し、事前に割り当てられたポインターをプッシュします。
- ポインターをポップします。値を割り当てます。
- hash_map に挿入:
- 項目を見つけて、アドレスへのポインターを取得します。insert を呼び出したにもかかわらず、hash_map が新しいペアを割り当てたようです。
これにより、削除とスタックへのプッシュが実行できなくなります。