函数每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”]] = ...' –