2016-08-29 7 views
-3

私は次のコードで++ベクトルCへ400mbファイルを読んでいる:STDとC++のメモリリーク::ベクトル

#define RAMALLOC 20000000 
struct worddata { 
    std::string name; 
    double ussage; 
}; 
// ... 
int counter = 0; 
std::string dName; 
double dUssage; 
std::vector<worddata> primDataBank; 
primDataBank.resize(RAMALLOC); 
std::ifstream fIn(PATH + "output.dat"); 
while (fIn >> dName >> dUssage) { 
    primDataBank[counter].name = dName; 
    primDataBank[counter].ussage = dUssage; 
    counter++; 
} 

私が割り当てるように私は、20,000,000アイテムのサイズにベクトルを居住していますそのループの中で、ラムの使用量は増えてはいけません。しかし、私はそれを実行すると、ラムの使用が急速に増加します。

Visual Studioデバッガのヒープスナップショットでは、RAMがprocessFrequencyData.exe!std::_Container_proxyで占有されていることがわかります。 「アロケーションコールスタックは、」そうのようになります。これは、ベクターにそのルーツを持っているように見えます

enter image description here

どのようにしてRAM使用量が増えるのを防ぐことができますか?

ありがとうございました。

アップデート:私は値

while (fIn >> dName >> dUssage) { 
    //primDataBank[counter].name = dName; 
    //primDataBank[counter].ussage = dUssage; 
    counter++; 
} 

を割り当てるwhileループ内のコードの行をコメントアウトするとき

私のRAMの使用量は依然としてしかしときに私も使用量が増加しないラム急速に増加

//std::vector<worddata> primDataBank; 
//primDataBank.resize(RAMALLOC); 
+2

[mcve]を教えてもらえますか? – jaggedSpire

+0

ベクトルのサイズを変更した直後にプログラムで一時停止を発行できますか?一時停止を押すと、メモリはもう割り当てられていないはずです。 –

+6

*私はベクトルを20,000,000アイテムのサイズにしていますので、ループでそれを割り当てると、ラムの使用量は増えないはずです。あなたのベクトルは、最初に*空の文字列*を含んでいます。 – Borgleader

答えて

1

ベクトルあなたの作成は、640Kは十分だろうと述べた640メガバイト//すなわち約

20000000 * 32バイト= 640 000 000を使用していますか?

worddataのサイズは、std :: stringから得られ、doubleは約24バイト+8です。

文字列の読み取りが十分に小さい場合、文字列の内部データと文字を格納するための容量を使用する小文字の最適化が使用されます。 しかし、それらが〜12(???)charsより大きい場合、文字列は文字を保持するために余分な配列を割り当てます。

アップデートにはさらに調査が必要です。

+0

私が必要とする最長の文字列は11文字です。私のプログラムが現在2GB以上を使用しようとしているので、640kbのメモリを使用するのは非常にうれしいでしょう。 – FelisPhasma

+0

@FelisPhasma、400 MBのテキストでは、あなたの現在の構造で実質的な量のメモリが必要です。あなたはテキストのために他の何かを試すことができます、例えば試してみてください。 – Surt

1

すべてのstを作成して保存するため、メモリ使用量が増えます。あなたがファイルから読んだリング。

文字列は固定サイズのオブジェクトではないため、文字列のスペースを事前に割り当てることができる唯一の方法はカスタムアロケータを使用することです。

あなたは予備emplace_backを使用してではなく、のサイズを変更すると、これはあなたが必要のない長さ0の文字列を割り当てないようになるようにフィールドを設定好む必要があります。

あなたのアップデートは信じられません。