次のような一連の構造があります。
typedef struct {
int a;
int b;
} ITEM;
typedef struct {
int orderID;
std::vector<ITEM> items;
} ORDER;
typedef struct {
int orderSetID;
std::vector<ORDER> Orders;
} ORDER_SET;
問題は、注文数が 100,000 ~ 10,000,000 の範囲であり、注文数が1 ~ 500ITEMS
の範囲であるということです。ORDER
問題は、私が を構築しているときORDER_SET
、いくつの ORDER があるか分からないことです。アイテムを追加すると、いくつのアイテムがあるORDER
かがわかります。ここにいくつかの問題があります:
1) 理想的には、Orders.resize() を使用してすべての ORDER にメモリを割り当てたら、メモリを再利用できますが、Orders.clear()
すべて削除されているようです。
2) Orders のある程度妥当なサイズから始めますOrders.resize(500,000)
が、問題は、多数の注文をヒットすると、すべてのORDER.item
ベクトルをコピーする必要があるため、Orders ベクトルのサイズ変更に永遠にかかることです。
スペア マトリックスの格納と同様の問題のように思えます。問題は、構造を作成する前に構造がどれくらい大きくなるか分からないことです。
追加情報:
1) Visual Studio 2008 の使用 2) 以下のコメントに投稿されているように、次の2 つのフィールドを ORDER_SET
置き換えることで、妥当な時間内に 10000000 注文を含むan の構築を改善することができました。items
typedef struct {
int orderID;
ITEM singleItem;
std::vector<ITEM> *pItems;
} ORDER;
すべての pItems を別のベクターに入れ、後で削除するために使用します。
残された大きな問題は、呼び出しORDER_SET.Orders.clear()
にかなりの時間がかかるように見えることです。理由はわかりませんが。
end
clear() のように、メモリを解放せずに設定するだけの呼び出しはありbegin
ますか? ベクトルが大きくなると、メモリが再び必要になる可能性があるため、メモリを解放する理由はまったくありません。