2016-07-14 48 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