2010-04-12 4 views
0

에서 나는 vb.net에서 웹 사이트에 대한 몇 가지 코드에서 작업하는 C#을 dev에입니다. 우리는 32bit iss 6 win 2003 상자에서 많은 캐싱을 사용하고 어떤 경우에는 OutOfMemoryException 예외를 발생시킵니다. 이 ... 코드가 내가 다시 그것을 추적하고 다른 사람이 가지고있는 경우 알고 싶습니다System.OutOfMemoryException이 발생했습니다. System.Text.RegularExpressions.CompiledRegexRunner.Go에서 Go60505 (RegexRunner)()

Public Sub CreateQueryStringNodes() 
    'Check for nonstandard characters' 
    Dim key As String 
    Dim keyReplaceSpaces As String 
    Dim r As New Regex("^[-a-zA-Z0-9_]+$", RegexOptions.Compiled) 

    For Each key In HttpContext.Current.Request.Form 
     If Not IsNothing(key) Then 
      keyReplaceSpaces = key.Replace(" ", "_") 
      If r.IsMatch(keyReplaceSpaces) Then 
       CreateNode(keyReplaceSpaces, HttpContext.Current.Request(key)) 
      End If 
     End If 
    Next 

    For Each key In HttpContext.Current.Request.QueryString 
     If Not IsNothing(key) Then 
      keyReplaceSpaces = key.Replace(" ", "_") 

      If r.IsMatch(keyReplaceSpaces) Then 
       CreateNode(keyReplaceSpaces, HttpContext.Current.Request(key).Replace("--", "-")) 
      End If 
     End If 
    Next 
End Sub 

.NET Framework 버전입니다 : 2.0.50727.3053; ASP.NET 버전 : 2.0.50727.3053

오류 :

Exception of type 'System.OutOfMemoryException' was thrown. at Go60505(RegexRunner) at System.Text.RegularExpressions.CompiledRegexRunner.Go() 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.Regex.IsMatch(String input) at Xcite.Core.XML.Write.CreateQueryStringNodes() at Xcite.Core.XML.Write..ctor(String IncludeSessionAndPostedData) at mysite._Default.Page_Load(Object sender, EventArgs e) at System.Web.UI.Control.OnLoad(EventArgs e) at System.Web.UI.Control.LoadRecursive() at

감사

+2

CreateNode는 어떻게됩니까? –

답변

1

꽤 많은 Compiled을 사용하지 말 there 밖으로 articlescouple있다, 정말 사람들이 생각하는 것을 의미하지 않는다 때때로 의미합니다. 내가 올바르게 이해한다면, Compiled를 사용하면 실제로 응용 프로그램의 지속 기간 동안 메모리를 영구적으로 먹게됩니다. 웹을 사용하고 있기 때문에 응용 프로그램의 수명이 상당히 길 수도 있습니다. 이것은 2.0 프레임 워크에서 고정/주소 지정되었지만 그렇지 않은 것처럼 보입니다.

+0

'CreateQueryStringNodes'가 호출 될 때마다 정규 표현식을 정적으로 만들 수 있습니다 :'Private Shared r As New Regex ("^ [- a-zA-Z0-9 _] + $", RegexOptions.Compiled)' –

+0

@ 0xA3도 가리킬 수 있습니다. Dim/Static RegEx 선언에 대해 10,000 사이클의 루프를 돌았습니다. Dim은 완료하기 위해 Static이 완료하는 데 14 초가 걸렸습니다. 더 많은 사람들이 정적 변수를 사용해야 할 때를 알고 싶습니다. –

+0

could -> good than –

0

그래서 코드가 모든 공백을 '_'으로 바꾸면 일치시킵니다. 이것은 대시 또는 밑줄이있는 alpanumeric의 유효성 검사일까요?

정규식 파서가 처리하는 데이터의 양은 얼마입니까?

은 (지금처럼)

로 변경 될 수 있습니다 패턴을 참고^[\ w -_] + $

(컴파일 된 정규식의 사용은 무엇 달리,이 상황에 대한 완벽주의 다른 게시물은 말한다). Base Class Library Performance Tips and Tricks를 섹션 정규 표현식 컴파일에서 :

진정 페이지에 무슨 일이 일어나고 있는지 이해하기 위해 체크 아웃 컴파일에 대해 알아 보려면. HTH

+0

감사합니다. – Deanvr

0

감사합니다! 내일 사무실에서 몇 가지 사항을 확인해 보도록하겠습니다. 두 가지 해결책을 함께 시도해 볼 수 있습니다. 몇 가지 테스트를 작성하고 알려 드리겠습니다. regex 파서는 긴 문자열에서 작동하고, create 노드는 나중에 html 출력을위한 xslt 변환을 위해 xml처럼 사용되는 목록 객체를 채우고 있으며 최종 출력에서 ​​응답 출력 캐싱을 사용하고 있습니다. 정적 변수가 asp.net 앱인 것처럼 차이를 만들 것이라고 생각하지 않습니다. CreateQueryStringNodes는 각 페이지의 페이지 수명주기 동안 한 번만 호출됩니다. I 앱 캐시에 넣어 덜 효과적 일 수를 가져 싱글하지만, 작업로 사용할 수 있습니다 - 다시 ... 내가 그것을 테스트

감사를 할 수 있습니다.

관련 문제