2016-07-14 90 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. 
} 

大約有30萬記錄字段id約36 B的db.The長度,和場對象的值是範圍從0到20因此的尺寸的位元素是40 B. 因此,在我看來,m_category的大小是: 40 * 300000 = 120,00,000 = 12M 但是12M遠小於1.2G!爲什麼? 順便說一下,我使用命令頂部和RES來查看進程的內存。 如何計算地圖元素的內存?

+0

'reset'容器使用多少內存? – GWW

+10

「SELECT * FROM info」 - 爲什麼?爲什麼選擇所有內容並在應用程序中處理它,而不是添加適當的「WHERE」子句,並讓數據庫在傳輸結果集之前縮小範圍? –

+0

爲什麼你使用'circleId'和'category'呢?只需直接設置地圖'temp [rset [i] [「id」]] = ...' –

回答

0

總結別人以上的評論。你的問題的答案是:你有內存泄漏。它不在你的函數中,它在MysqlData類中,你沒有在這裏發佈。所以如果你需要進一步的幫助,你將不得不向我們提供所有的信息。

+0

_「它在你沒有發佈的MysqlData類裏面」_ - 是的,因爲如果你看不到它並且不能檢查它,那它肯定是罪魁禍首。我確信OP的項目中有很多代碼是可疑的,所以爲什麼對這樣一個絕對的觀點採取狹義的觀點? –

+0

@CaptainObvlious - a)因爲OP說不調用這個函數消除了問題,所以問題在函數中比沒有問題更有可能,b)因爲MysqlData類隱藏了一個或多個非常大的數據庫操作,保存整個記錄集(通過查看提供的代碼,這是顯而易見的)。但實際上,我不認爲我們會再次聽到OP,我敢打賭,這不僅是他在SO上的首次亮相,也是他的最後一次亮相。正如第一次提問時經常發生的那樣。 – davidbak