函數每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來查看進程的內存。 如何計算地圖元素的內存?
'reset'容器使用多少內存? – GWW
「SELECT * FROM info」 - 爲什麼?爲什麼選擇所有內容並在應用程序中處理它,而不是添加適當的「WHERE」子句,並讓數據庫在傳輸結果集之前縮小範圍? –
爲什麼你使用'circleId'和'category'呢?只需直接設置地圖'temp [rset [i] [「id」]] = ...' –