3

我有一个生产代码版本的异常日志。

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:

我认为这个特殊的 RegEx 导致了这个问题,当我在一个孤立的环境中测试它时,它会立即吃掉内存。

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

编辑

我的本地测试错了。我正在加载一个大字符串,然后在其上附加一些东西,这使 .NET Framework 头晕目眩,然后在 RegEx 期间而不是在字符串操作期间给出 OOM 异常(或随机,所以忽略我之前说过的东西)。

这是一个 .NET Framework 2.0 应用程序。

4

3 回答 3

2

没有看到你的正则表达式,我不确定,但有时你会遇到这样的问题,因为你的匹配是贪婪而不是懒惰。

Regex 引擎必须在内部存储大量信息,贪婪匹配最终可能导致 Regex 多次选择 800k 字符串的大部分。

这里有一些很好的信息。

于 2009-04-07T14:18:56.607 回答
1

如果您的应用程序可能,我会尝试的第一件事是拆分输入。

是否可以逐行读取文件(如果输入是文件),以这种方式应用正则表达式?

你应该看看CLR Profiler。学习如何使用可能需要一点时间,但这是值得的。它将帮助您可视化您的对象使用了多少内存。

于 2009-04-07T13:59:30.243 回答
1

根据您的编辑,听起来您的代码可能正在创建占用大量内存的字符串。这意味着即使内存不足异常是从 Regex 代码中生成的,这实际上并不是因为 Regex 本身占用了太多内存。因此,如果在您自己的代码中使用 StringBuilder 可以解决问题,那么您应该这样做。

于 2009-04-07T14:06:36.933 回答