2016-07-14 2 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 36 B의 db.The 길이 약 300,000 레코드가 한 필드에 피사체의 값은 0 내지 20. 그래서 크기 범위 숫자이다

요소는 40B입니다. 따라서 내 의견으로는, m_category의 크기는 다음과 같습니다. 40 * 300000 = 120,00,000 = 12M 그러나 12M은 1.2G보다 훨씬 적습니다! 왜? 저는 명령 top과 RES를 사용하여 프로세스의 메모리를 봅니다. 지도 요소의 메모리를 계산하는 방법은 무엇입니까?

+0

'리셋'컨테이너는 얼마만큼의 메모리를 사용합니까? – GWW

+10

"SELECT * FROM info"- 이유가 무엇입니까? 왜 모든 것을 선택하고 적절한 "WHERE"절을 추가하는 대신 응용 프로그램에서 처리하고 데이터베이스가 결과 집합을 전송하기 전에 범위를 좁히는 이유는 무엇입니까? –

+0

왜 'circleId'와'category'를 사용하고 있습니까? –

답변

0

다른 사람들이 위에서 언급 한 내용을 요약합니다. 귀하의 질문에 대한 답변 : 당신은 메모리 누출이 있습니다. 그리고 그것은 당신의 기능에 있지 않습니다, 당신이 여기에 게시하지 못한 MysqlData 클래스 안에 있습니다. 따라서 도움이 더 필요하면 우리 모두에게 모든 정보를 제공해야합니다.

+0

_ "여기에 게시하지 못한 MysqlData 클래스 안에 있습니다."- 네, 당신이 그것을 볼 수없고 그것을 조사 할 수 없다면 범인이되어야합니다. 의심의 여지가있는 OP 프로젝트에는 많은 코드가 있으므로 그러한 절대적인 견해에 대해 좁은 견해를 갖는 이유는 무엇입니까? –

+0

@CaptainObvlious - a) OP에서이 함수를 호출하지 않으면 문제가 없어지므로 문제가없는 것보다 함수에있을 가능성이 높으므로 b) MysqlData 클래스가 하나 이상의 매우 큰 데이터베이스 작업을 숨기고 있기 때문에 전체 레코드 세트를 보유합니다 (제공된 코드를 보면 분명합니다). 그러나 실제로, 나는 우리가 다시 OP에서 들으 려하지 않을 것이라고 생각한다 : 나의 내기는 이것이 SO에서 그의 첫 모습 일뿐만 아니라 그의 마지막 모습이기도하다는 것이다. 처음 질문으로 자주 발생합니다. – davidbak