문제

프로덕션 코드 릴리스 중 하나에서 예외 로그가 있습니다.

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
   at System.Text.RegularExpressions.Match..ctor(Regex regex, Int32 capcount, String text, Int32 begpos, Int32 len, Int32 startpos)
   at System.Text.RegularExpressions.RegexRunner.InitMatch()
   at System.Text.RegularExpressions.RegexRunner.Scan(Regex regex, String text, Int32 textbeg, Int32 textend, Int32 textstart, Int32 prevlen, Boolean quick)
   at System.Text.RegularExpressions.Regex.Run(Boolean quick, Int32 prevlen, String input, Int32 beginning, Int32 length, Int32 startat)
   at System.Text.RegularExpressions.MatchCollection.GetMatch(Int32 i)
   at System.Text.RegularExpressions.MatchEnumerator.MoveNext()

처리하려는 데이터는 약 800KB였습니다.

내 지역 테스트에서는 완벽하게 잘 작동합니다. 비슷한 행동을 본 적이 있습니까? 원인은 무엇입니까?

처리하기 전에 텍스트를 분할해야하지만, 원래 파일이 임의의 위치에서 분할되어 REGEX가 일치하지 않을 수 있습니다.

내 regexes :

편집 2 :

나는이 특별한 성분이 문제를 일으키고 있다고 생각합니다. 고립 된 환경에서 테스트 할 때 메모리를 즉시 먹고 있습니다.

((?:( |\.\.|\.|""|'|=)[\/|\?](?:[\w#!:\.\?\+=&@!$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2})*)( |\.|\.\.|""|'| ))?

편집하다

나는 현지 시험에 틀렸다. 나는 큰 문자열을로드 한 다음 그것에 물건을 추가하여 .NET 프레임 워크를 현기증으로 만들고 문자열 작업 중 대신 regex 동안 OOM 예외를 제공했습니다 (또는 무작위로 말한 이전의 것들을 무시합니다).

이것은 .NET Framework 2.0 응용 프로그램입니다.

도움이 되었습니까?

해결책

당신의 정규식을 보지 않으면, 나는 확실하지 않지만 때로는 당신의 경기가 게으르지 않고 탐욕 스럽기 때문에 이와 같은 문제를 얻을 수 있습니다.

Regex 엔진은 내부적으로 많은 정보를 저장해야하며 탐욕스러운 경기는 결국 800k 문자열의 큰 섹션을 여러 번 선택하게 만들 수 있습니다.

이것에 대한 좋은 정보가 있습니다 여기.

다른 팁

편집에 따라 코드가 많은 양의 메모리를 차지하는 문자열을 생성하는 것처럼 들립니다. 이것은 Regex 코드 내에서 메모리 외 예외가 생성 되더라도 실제로 Regex 자체가 너무 많은 메모리를 차지하기 때문이 아닙니다. 따라서 자신의 코드에서 StringBuilder를 사용하면 문제가 해결되면 이것이해야 할 일입니다.

응용 프로그램이 가능하다면 가장 먼저 시도하는 것은 입력을 분할하는 것입니다.

파일을 읽을 수 있습니까 (입력이 파일 인 경우) 라인별 라인으로 정규 표현식을 적용 할 수 있습니까?

당신은 함께 살펴 봐야합니다 CLR 프로파일 러. 사용 방법을 배우는 데 약간의 시간이 걸릴 수 있지만 그만한 가치가 있습니다. 객체가 얼마나 많은 메모리를 사용하는지 시각화하는 데 도움이됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top