我从某个生产代码版本中获得了异常日志。
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 应用程序。
最佳答案
如果没有看到你的正则表达式,我不确定,但有时你会遇到这样的问题,因为你的匹配是贪婪的而不是懒惰的。
正则表达式引擎必须在内部存储大量信息,而贪婪匹配最终可能会导致正则表达式多次选择 800k 字符串的大部分。
here 有一些关于此的好信息。 .
关于.net - 处理大文件时正则表达式匹配中的 OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/725817/