2016-07-14 3 views
-1

Eine Funktion wird alle 5 min ausgeführt. Wenn die Funktion in dem Prozess ist, wird der Speicher des Prozesses 1.2G erreichen! Wenn die Funktion entfernt wird, beträgt der Speicher etwa 20M. Die Funktion ist:berechnen Sie den Speicher von C++ Karte

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. 
} 

Es gibt etwa 300.000 Datensätze in der db.The Länge des Feldes ID 36 zu B, und der Wert des Feldes Thema ist eine Ziffer, die also die Größe von 0 bis 20 reicht Element ist 40 B. So ist meiner Meinung nach die Größe von m_category: 40 * 300000 = 120,00,000 = 12M Aber 12M ist viel weniger als 1,2G! Warum? BTW, ich benutze den Befehl oben und die RES, um den Speicher des Prozesses zu sehen. Wie berechnet man den Speicher der Kartenelemente?

+0

Wie viel Speicher verwendet der 'reset'-Container? – GWW

+10

"SELECT * FROM info" - Warum? Warum sollten Sie alles auswählen und in der Anwendung verarbeiten, anstatt die entsprechende "WHERE" -Klausel hinzuzufügen und die Datenbank die Ergebnismenge vor der Übertragung eingrenzen zu lassen? –

+0

Warum benutzen Sie überhaupt 'circleId' und' category'? Setzen Sie einfach die Karte direkt 'temp [rset [i] [" id "]] = ...' –

Antwort

0

Zusammenfassend, was andere oben erwähnt haben. Die Antwort auf Ihre Frage lautet: Sie haben ein Speicherleck. Und es ist nicht in Ihrer Funktion, es ist innerhalb der MysqlData-Klasse, die Sie hier nicht veröffentlichen konnten. Wenn Sie also weitere Hilfe benötigen, müssen Sie uns alle Informationen zur Verfügung stellen.

+0

_ "Es ist in der MysqlData-Klasse, die Sie hier nicht veröffentlichen konnten" _ - Ja, denn wenn Sie es nicht sehen können und es nicht untersuchen können, dann muss es der Schuldige sein. Ich bin mir sicher, dass es im OP-Projekt eine Menge Code gibt, der verdächtig ist. Warum also solch eine absolute Sichtweise auf solch ein absolutes Thema? –

+0

@CaptainObvlious - a) weil das OP sagte, dass das Nichtaufrufen dieser Funktion das Problem beseitigte, so dass das Problem viel wahrscheinlicher in der Funktion als ohne ist, und b) weil die MysqlData-Klasse einen oder mehrere sehr große Datenbankoperationen versteckt ein ganzes Recordset zu halten (dies wird offensichtlich, wenn man sich den bereitgestellten Code anschaut). Aber ich glaube nicht, dass wir jemals wieder von der OP hören werden. Meine Wette ist, dass dies nicht nur sein erster Auftritt bei SO war, sondern auch sein letzter. Wie oft bei Erstfragen. – davidbak