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

.net 处理大型文件时,正则表达式中的OutOfMemoryException匹配,.net,regex,performance,memory,out-of-memory,.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 Sy

我从一个生产代码版本中得到了一个异常日志

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

在我的本地测试中,它工作得非常好。你见过类似的行为吗?原因是什么

我应该在处理之前分割文本,但显然在这种情况下,regex可能不匹配,因为原始文件从随机位置分割

我的正则表达式:

编辑2:

我认为这个特殊的正则表达式导致了这个问题,当我在一个孤立的环境中测试它时,它会立即消耗内存

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

我的本地测试出了问题。我加载了一个大字符串,然后在其中添加了一些东西,这会让.NET Framework头晕目眩,然后在正则表达式期间而不是在字符串操作期间(或者随机地,所以忽略前面提到的东西)给出一个OOM异常


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

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

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


你应该和我一起去看看。学习如何使用可能需要一点时间,但这是值得的。它将帮助您可视化对象使用的内存量。

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

在没有看到您的正则表达式的情况下,我不确定,但有时您可能会遇到这样的问题,因为您的匹配是贪婪的,而不是懒惰的

正则表达式引擎必须在内部存储大量信息,贪婪的匹配可能会导致正则表达式多次选择800k字符串的大部分


关于这一点,这里有一些很好的信息。

您能列出使用regex的代码吗?2与此相关的问题。我最初在正则表达式中使用单线作为选项。所以逐行阅读可能会破坏一些正则表达式。其次,这会对较短文件的性能产生不良影响(显然,我可以根据大小进行切换,但听起来很脏:)但是,如果我无法修复它,这是一个好主意)我打赌,对于小文件,一行一行的性能差异,同时应用正则表达式将非常简单,不会产生明显的影响。我知道stringbuilder在这方面很好,但我的意思是将stringbuilder与正则表达式一起使用听起来像是帮助正则表达式运行程序更有效地使用内存,这对我来说是全新的。这是可能的,我不确定StringBuilder是否能让Regex更高效地工作,但在我看来,这不是你应该依赖的。如果您的内存不足,这可能表明有一个更大的设计问题需要解决。显然,我搞砸了我的本地测试,请查看我的最终编辑。完全正确,我刚刚解决了这个问题并更新了我的示例。这不是原始代码的行为,而是测试代码。查看我的最终编辑。把我的正则表达式放到问题上。你有一小段你想要匹配的内容吗?它是Html还是可能包含URL的文本?在最新的正则表达式中,如果将最后一个“”更改为“”,会发生什么情况?“它是Html,只需使用Yahoo的源代码,实际上所有内容都需要很长时间。我现在就试试这个改变。似乎对我不起作用,那个正则表达式用一个30k的html文件最大化了我的测试程序,用于Cpu周期!