2016-07-14 6 views
-1

関数は5分ごとに実行されます。関数がプロセス内にある場合、プロセスのメモリは1.2Gに達します!機能を削除すると、メモリは約20Mになります。関数は、次のとおりC++マップのメモリを計算する

string sql = "SELECT * FROM info"; 
MysqlData rset = mysql.queryRecord(sql); 
map<string, int> temp; 
for (size_t i = 0; i < rset.size(); i++) { 
    const string& circleId = rset[i]["id"]; 
    const int category = strto<int>(rset[i]["subject"]); 
    temp[circleId] = category; 
} 
if (!temp.empty()) { 
    m_category.swap(temp); //m_category is global variable. 
} 

ありフィールドIDのdb.The長さで約300,000レコード約36 Bであり、そしてフィールド対象の値が大きさのだから、0から20の範囲の数字であります要素が40Bです。 したがって、m_categoryのサイズは、 です。40 * 300000 = 120,00,000 = 12M しかし、12Mは1.2Gよりもはるかに小さいです!どうして? ところで、私はtopコマンドとRESコマンドを使ってプロセスのメモリを見ます。 マップ要素のメモリを計算するにはどうすればよいですか?

+0

'reset'コンテナはどれくらいのメモリを使用していますか? – GWW

+10

"SELECT * FROM info" - なぜですか?適切な「WHERE」節を追加するのではなく、アプリケーションですべてを選択して処理し、データベースに結果セットを絞り込んで送信させるのはなぜですか? –

+0

なぜ 'circleId'と' category'を使っていますか? –

答えて

0

上記で他の人がコメントしたことを要約します。あなたの質問に対する答えは、あなたはメモリリークがあるということです。それはあなたの関数ではなく、ここに投稿できなかったMysqlDataクラスの中にあります。あなたがさらに助けを必要とするならば、私たちにすべての情報を提供しなければなりません。

+0

_ "あなたがここに投稿できなかったMysqlDataクラスの中にあります" - あなたがそれを見ることができずそれを調べることができないならそれは犯人でなければならないからです。私はOPのプロジェクトに疑わしいコードがたくさんあるので、そのような絶対的なものについてそのような狭い見方を取るのはなぜですか? –

+0

@CaptainObvlious - a)OPがこの機能を呼び出さないと問題が解消され、問題がなくなる可能性があるため、b)MysqlDataクラスが1つ以上の非常に大きなデータベース操作を隠しているためレコードセット全体を保持しています(これは提供されたコードを見ると明らかです)。しかし、実際には、私は再びOPから聞くつもりはないと思う:私の賭けは、これが彼の最初の出演ではなく、彼の最後の出演でもあったということだ。最初の質問で頻繁に起こるように。 – davidbak

関連する問題