OutOfMemoryException异常的正则表达式处理大型文件时较量
-
05-09-2019 - |
题
我已经从生产代码发布一个得到了一个异常日志。
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框架晕了,然后正则表达式中,而不是在字符串操作给出一个OOM异常(或随机,所以忽略以前的东西,我已经说过了)。
这是一个.NET Framework 2.0应用程序。
解决方案
没有看到你的正则表达式,我不知道是肯定的,但有时因为你的匹配是贪婪的,而不是懒惰的,你可以得到这样的问题。
正则表达式引擎必须存储大量的信息在内部和贪婪的比赛可以最终导致的正则表达式在选择800K串大段,很多次了。
有是关于一些好的信息,这在这里。
其他提示
根据您的编辑,这听起来像您的代码可被创建,其会占用大量的存储串。这意味着,即使从正则表达式的代码中产生的内存溢出异常,但实际上并不是,因为正则表达式本身占用太多的内存。因此,如果在自己的代码使用StringBuilder的解决问题,那么这就是你应该做的。
的第一件事我会尝试,如果能够为您的应用,将是分裂的输入。
是否可以读取文件(如果输入是一个文件)线由行,应用正则表达式的方法吗?
您应该采取与 CLR探查的看看。这可能需要一点时间来学习如何使用,但它是值得的。这将帮助您可视化你的对象使用的内存量。
不隶属于 StackOverflow