2016-05-22 16 views
-2

cは私がメインでのstd ::地図(STD :: Bad_alloc)++

class memModel 
{ 
    struct Addrlist 
    { 
     vector<string> data; 
     vector<int> timestamp; 
     vector<string> client; 
    } 

    map<int, Addrlist> AddrMap ; //store based address and list of all accesses 
} 

私のプログラムでは、次のしている()私はいくつかのファイルから読み取られ、数百万を保存しますこのstuct

int main() 
{ 
    memModel newObj ; 
    ifstream file1("dataStream"); 
    ifstream file2("timeStampSteam"); 
    ifstream file3("clientStream"); 
    ifstream file4("addrStream") ; 
    string dataSTR,clientSTR; 
    int time = 0 ; 
    int addr; 
    for(int i=0; i<10000000/*10mil*/ ; i++) 
    { 
     getline(file1,dataSTR); 
     getline(file3,clientSTR); 
     file2 >> time ; 
     file4 >> hex >> addr ; 

     newObj.AddrMap[addr].data.push_back(dataSTR) ; 
     newObj.AddrMap[addr].time.push_back(time) ; 
     newObj.AddrMap[addr].client.push_back(clientSTR) ; 
    }  

    }  

へのエントリーは、だから、問題は、私はメモリ不足とstd :: Bad_allocの例外を取得しています。このコードは、より小さなデータサイズで動作します。

私は構造体とマップが格納されている場所を理解しようとしています。すべてがスタックになっていますか? ベクトルは動的に右に割り当てられます。それらはヒープに行くのですか?

大きなデータセットを扱うのはこれが初めてのことです。そのため、概念をよりよく理解したいと思います。どのように私はヒープを使用していると私はメモリが不足していないことを確認するためにこれを変更することができます。

+1

推奨読者:http://stackoverflow.com/a/37352109/560648 –

+0

「addr」の繰り返しがまれである場合、データモデルは愚かです。 –

+0

平均して、それぞれのユニークなアドレスの100〜150回の繰り返しを見ています。 – akslah

答えて

4
newObj.AddrMap[addr].data[i] = dataSTR ; 
    newObj.AddrMap[addr].time[i] = time ; 
    newObj.AddrMap[addr].client[i] = clientSTR ; 

これは、3つのデータ項目を3つのベクトルに格納します。

残念ながら、これらのベクトルはすべて空であり、要素は含まれていません。この結果、未定義の動作が発生します。

push_back()またはresize()これらのベクターを事前に使用する必要があります。そのため、配置するアイテムをベクターに格納するのに十分なサイズです(ここでは、ここをクリックしてください)。

std::vectoroperator[]は、アレイを自動的に作成またはサイズ変更しません。配列内の既存の要素にアクセスするだけです。

+0

これは、私が書いたコード例の間違いでした。実際のプログラムにはその問題はなく、私はpush_back()を使用します。質問の例を更新しました。 – akslah

+2

その場合は、教訓としてこれを取ってください。実際のコードを投稿してください。 –

+0

実際のコードは膨大です。私はこれが私が直面している問題を説明する最も簡単な例だと思う。私は大規模なデータセットを扱う経験を持つ人々からいくつかのヒントを求めています。他の人々のコードを修正しないでください、彼らはそのように習得しません。 – akslah

関連する問題