3

많은 개체가 큰 개체 힙에서 메모리 할당을 받기 때문에 C# 응용 프로그램에서이 응용 프로그램이 메모리 부족 문제를 겪고 있습니다.큰 개체 힙 메모리에서 일부 메모리를 미리 할당합니다.

내 C# 응용 프로그램이 여러 개의 큰 파일 (문자열 개체)로 작동해야하므로이 문자열 유형 개체의 메모리가 LOW 개체 힙에서 반복 할당되어 LOH 조각화로 이어집니다.

문자열은 변경 불가능한 객체이므로 LOH의 새 메모리는 항상이 객체에 할당됩니다. 내 질문은, 거기에 큰 개체 힙에 일부 메모리를 미리 할당 할 수 및 항상 문자열 개체에 동일한 메모리를 할당 할 수있는 방법입니다.

자세한 내용은 다음과 같습니다. 앞서 언급했듯이이 큰 파일에 대한 처리를하고 있습니다. 처리하려면 문자열로 변환해야합니다. 비록 내가 stringBuilder를 사용한다고하더라도, LOH에 할당 된 문자열을 별도의 메모리로 변환하자마자 도움이되지 않을 것입니다.

메모리에 100KB를 할당하고 새 파일을 읽고 문자열로 변환 할 때마다이 100KB가 할당됩니다.

+2

기본적으로 변경할 수있는 문자열 인'StringBuilder'를 사용하십시오. –

+5

왜 같은 문자열을 반복해서 할당하고 있습니까? 한 번 만들었다면 모든 소비자에게 전달하십시오. – Andrei

+2

왜 LOH 단편화가 문제라고 생각하십니까? – svick

답변

3

문자열을 조작하려면 문자열이 변경 가능하고 많은 작업 방법을 제공하므로 문자열을 사용하려면 StringBuilder 개체를 사용해야합니다.

모든 문자열이 반복해서 생성된다고합니다. 웬일인지 문자열을 사용해야 할 경우 문자열을 한 번만 저장하면 메모리 힙에 다시 저장되지 않습니다.

+2

인턴은 오직 같은 문자열 (파일로부터)의 많은 시간에 대해서만 작동합니다. 그럴 가능성은 희박하다. –

+0

나는 모든 변종을 말했어. – VMAtm

1

문자열로 어떤 작업을 수행하려고하는지 명확하지 않습니다. 가장 좋은 장면은 최종 결과의 추정치입니다. 비관적 (큰) 견적을 사용하고 마진을 추가하십시오. 본질적

var buffer = new StringBuilder(LargestExpectedSize); 

를 LOH에 사전 할당이다

그러면 능력 파라미터와의 StringBuilder를 생성한다. StringBuilders 또는 List<>의 자 동화를 피하십시오.

관련 문제