.net - 处理大文件时正则表达式匹配中的 OutOfMemoryException

标签 .net regex performance memory out-of-memory

我从某个生产代码版本中获得了异常日志。

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/

相关文章:

c# - 在 DbContext 中动态查找通用 DbSet

c# - 我应该如何正确使用 Fluent NHibernate.Testing CheckList?

c# - 公开可用操作的正确模式

regex - Salt-stack 与 Pam.d 一起工作

regex - 这个正则表达式做什么?时髦

python - 在python中通过子字符串匹配两个数据帧

logging - 性能统计 Hook

c# - Windows Phone 8.1 中的进度条

regex - 从 0 到 120 的模式的 HTML5 正则表达式,间隔为 5,允许空格?

javascript - id太多会影响性能吗