我收到了一份来自生产代码发布的异常日志。
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。
在我的本地测试中,它完美地工作。您是否见过类似的行为,可能是什么原因?
我应该在处理之前拆分文本,但显然在这种情况下,正则表达式可能无法匹配,因为原始文件从一个随机位置开始拆分。
我的正则表达式:
编辑2:
我认为这个特定的正则表达式导致了问题,在隔离环境中测试时,它会立即消耗内存。
((?:( |\.\.|\.|""|'|=)[\/|\?](?:[\w#!:\.\?\+=&@!$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2})*)( |\.|\.\.|""|'| ))?
编辑
我在本地测试中出现了一些问题。我加载了一个大字符串,然后往里添加东西,这使得.NET Framework感到晕眩,并在RegEx期间而不是在字符串操作期间(或随机发生)引发OOM异常(忽略我之前说的内容)。
这是一个.NET Framework 2.0应用程序。