2016-08-29 5 views
-3

표준 : : 벡터와 메모리 누수가 : 내가 지정할 수 있도록C++ 나는 다음과 같은 코드 ++ 벡터는 C로 <code>400mb</code> 파일을 읽고 있어요

#define RAMALLOC 20000000 
struct worddata { 
    std::string name; 
    double ussage; 
}; 
// ... 
int counter = 0; 
std::string dName; 
double dUssage; 
std::vector<worddata> primDataBank; 
primDataBank.resize(RAMALLOC); 
std::ifstream fIn(PATH + "output.dat"); 
while (fIn >> dName >> dUssage) { 
    primDataBank[counter].name = dName; 
    primDataBank[counter].ussage = dUssage; 
    counter++; 
} 

나는 20,000,000 항목의 크기로 벡터를 거주 한 그걸 반복하면 램 사용량이 증가해서는 안된다. 그러나 그것을 실행할 때 램 사용이 급격히 증가합니다.

Visual Studio 디버거 힙 스냅 샷에서 RAM이 processFrequencyData.exe!std::_Container_proxy으로 점유되었음을 나타냅니다. 은 "할당 호출 스택은"지금처럼 보인다 :이 벡터에 뿌리를 가지고 나타납니다

enter image description here

.

램 사용량이 늘어나는 것을 어떻게 막을 수 있습니까?

감사합니다.

업데이트 : 경우에도 I

내 램 사용량이 아직도 내가 값을 할당 while 루프의 코드 라인을 주석 때 빠르게 증가

while (fIn >> dName >> dUssage) { 
    //primDataBank[counter].name = dName; 
    //primDataBank[counter].ussage = dUssage; 
    counter++; 
} 

그러나 램 사용량이 증가하지 않는다 벡터 코드를 주석으로 처리하십시오 :

//std::vector<worddata> primDataBank; 
//primDataBank.resize(RAMALLOC); 
+2

[mcve]를 제공 할 수 있습니까? – jaggedSpire

+0

벡터의 크기를 조정 한 직후에 프로그램에서 일시 중지를 실행할 수 있습니까? 일시 중지를 누르면 더 이상 할당되지 않은 메모리가 표시됩니다. –

+6

* 나는 벡터 크기가 20,000,000 개이므로, 루프에서 할당 할 때 숫양 사용량이 증가하지 않아야합니다. * 음 ... 그렇습니다. 귀하의 벡터는 처음에는 루프를 수행하는 동안 채우는 * 빈 문자열 *을 포함하며, 메모리를 차지합니다. – Borgleader

답변

1

하여 만들기가 사용하는 벡터 약

20000000 * 32 바이트 = 6백40메가바이트 즉 640 000 000 // 640 K가 충분히있을 것이라고 말했다 누구?

worddata의 크기는 std :: string에서 유래하지만 double 값은 약 24 bytes + 8입니다.

문자열이 충분히 작 으면 문자열에 내부 데이터와 문자 저장 용량을 사용하는 작은 문자열 최적화를 사용할 수 있습니다. 그러나 ~ 12 (???) chars보다 큰 경우 문자열은 문자를 유지하기 위해 여분의 배열을 할당합니다.

업데이트를 받으려면 조사가 더 필요합니다.

+0

내가 필요로하는 가장 긴 문자열은 11 자입니다. 내 프로그램이 현재 2GB 이상을 사용하려고 할 때만 640kb의 메모리를 사용하는 것이 좋습니다. – FelisPhasma

+0

@FelisPhasma, 400MB 텍스트의 경우 현재 구조에 실질적인 메모리가 필요합니다. 예를 들어 텍스트를 시도해 볼 수 있습니다. – Surt

1

모든 st 코드를 작성하여 저장하므로 메모리 사용량이 늘어납니다. 파일에서 읽은 벨소리.

문자열은 고정 크기 개체가 아니므로 문자열에 대한 공간을 미리 할당 할 수있는 유일한 방법은 사용자 지정 할당자를 사용하는 것입니다. 크기를 조정하고이 같은 설정 필드가 필요없는 0 길이 문자열을 할당 피할 수 오히려 보다

당신은 예비emplace_back를 사용하는 것을 선호한다.

나는 당신의 업데이트를 믿기 어렵다고 생각한다.