LOH 조각화를 일으키지 않고 큰 문자열에서 RegExes (일치하는 항목을 찾기 위해)를 많이 실행하려면 어떻게해야합니까?RegEx, StringBuilder 및 Large Object 힙 조각화
.NET Framework 4.0이므로 StringBuilder
을 사용하고 있지만 LOH에는 RegEx를 실행하는 즉시 LOH에있는 StringBuilder.ToString()
을 호출해야합니다.
이 문제를 해결하려면 어떤 해결책이 있습니까? 큰 문자열과 RegExes를 처리하는 응용 프로그램을 오래 실행하는 것은 사실상 불가능합니다.
아이디어
이 문제를 해결하려면이 문제에 대해 생각하는 동안을, 나는 더러운 해결책을 찾은 것 같아요.
주어진 시간에 나는 단지 5 개의 문자열을 가지고 있으며이 5 개의 문자열 (85KB보다 큽니다)은 RegEx.Match
으로 전달됩니다.
새로운 객체가 LOH의 빈 공간에 적합하지 않기 때문에 단편화가 발생하기 때문에,이 문제를 해결해야 최대로
PadRight
모든 문자열을. 허용 크기는의는 가
- 어떤 분열로 인해이되지 않습니다 이전 문자열이 범위를 벗어나 이미 이미 비워진 메모리를 맞는 때문에 모든 새로운 문자열을 이렇게함으로써
- (나는
StringBuider
이 작업을 수행해야 할 수도 있습니다) 1,024킬로바이트을 가정 해 봅시다 객체 크기는 항상 동일하므로 주어진 시간에 1024 * 5 만 할당하고 LOH의 이러한 공간은이 문자열간에 공유됩니다.
나는 다른 큰 개체를 응용 프로그램이 어쩌면 더 악화 조각화 1,024킬로바이트 문자열을 많이 할당하는 원인이 LOH에서이 위치를 할당 할 경우 발생하는이 디자인의 가장 큰 문제를 가정합니다. fixed
문을 사용하면 고정 메모리 주소에없는 새 문자열을 실제로 만들지 않고도 RegEx에 고정 문자열을 보내려면 어떻게해야합니까?
이 이론에 대한 아이디어가 있으십니까? (불행히도 나는 쉽게 문제를 재현 할 수 없다. 나는 일반적으로 메모리 프로파일 러를 사용하여 변경 사항을 관찰하고 어떤 종류의 분리 된 테스트 케이스를 쓸 수 있는지 확실하지 않다.)
대형 오브젝트 힙이 단편화되어 있는지 확실합니까? 커다란 (수 백 킬로바이트) 문자열로 많은 작업을하고 LOH 단편화 문제를 겪어 본 적이 없습니다. –
예, 확실합니다. 응용 프로그램은 메모리 부족으로 인해 실제로 영향을받는 데 시간이 오래 걸릴 수 있습니다. 실제로 메모리 프로파일 링을 수행하면 영향을 미치지 만 앱을 크래시 할 정도는 아닙니다. –
예, 쉽습니다. 뚱뚱한 백 달러가 당신에게 64 비트 운영 체제를 사주고 있습니다. 어떤 종류의 프로그래밍 노력도 그와 일치 할 수 없습니다. –