私は2,3日間メモリ問題を追跡しようとしています。私のプログラムは約3GBのメモリを使用しています。約200MB〜300MBを使用する必要があります。 Valgrindは実際にピーク時に〜300MBを使用していると報告しており、メモリリークは報告されていません。巨大メモリの使用量を追跡できません
プログラムは入力ファイルを読み込み、そのファイルにすべてのユニークワードを格納します。それはマルチスレッドであり、私は4つのスレッドを使って実行しています。データの私の主な発生源は、以下のとおりです。言葉と関連する値のリストの間
- wchar_t型の定数サイズの配列(4MBの合計)
- 地図。これは入力の大きさとともに増加します。入力ファイルに一意の単語が1,000,000件ある場合、ツリーには1,000,000件のエントリが存在します。
私は膨大な数の割り当てと割り当て解除(新規と削除を使用して) - ユニークワードあたり少なくとも2つを実行しています。私が解放したメモリが何らかの理由で再利用されていない可能性はありますか?プログラムはますます多くのメモリを獲得し続けるでしょうか?それは継続的に実行されると、より一貫してそれをつかむ。
一般的に、私はここからどこに行かなければならないのですか?
編集1(Grahamのアドバイスに基づいて): 割り当てを最小限に抑えることを試みます。私はスレッドごとに1つの文字列(単語がこの文字列よりも長い場合には時々成長するかもしれません)で作業しますが、私のコードを正しく覚えていれば、膨大な数の新規/削除呼び出しがなくなります。すべてがうまくいけば、入力バッファの一回限りの割り当て、スレッドごとの文字列の割り当て(いくつかのrealloc)、マップエントリごとの2つのalloc(キー用と、値用)が残されます。
ありがとうございます!
グラハムの答えが有効であるようです。どのくらいのメモリが使用されているのか、実行中のOS(64ビットまたは32ビット)はどのように決定していますか?データ構造や完全なクラスオブジェクトだけを新規/削除するオブジェクトはありますか? – Foon
私はValgrindとコマンドfree -mを使用しています(どのくらいのメモリが空いているかを報告します。これは64ビットLinux上です。私はstd :: wstringとc-style文字列を使ってこれを試しました。 – lapis